ソースの表示以前のリビジョンバックリンク全て展開する/折り畳む文書の先頭へ Share via Share via... Twitter LinkedIn Facebook Pinterest Telegram WhatsApp Yammer Reddit Teams最近の変更Send via e-Mail印刷パーマリンク × « FreeBSD 11-STABLEでVirtualBox復活(`・ω・´) portsnapにautoなるコマンドが実装されてた » FName::GetPlainANSIString()で正しい文字列が取れない事がある お急ぎのあなたのために、まずは結論。FNameが保持する文字列が必要な時はToString()で生成したFStringを使うべし。GetPlainANSIString()とGetPlainWIDEString()を使うとハマるから止めといた方がいい。 Unreal Engine 4の軽量文字列クラスFName(公式リファレンス)のGetPlainANSIString関数/GetPlainWIDEString関数で取得できる文字列ポインタには、そのFNameインスタンスが本来持っている文字列の一部しか入っていない事がある。恐らく仕様。以下が実証コード。 TArray<FName> Names; Names.Add(FName(TEXT("Hoge_"))); Names.Add(FName(TEXT("Hoge_0000"))); Names.Add(FName(TEXT("Hoge_0001"))); Names.Add(FName(TEXT("Hoge_10"))); Names.Add(FName(TEXT("Hoge_1200"))); Names.Add(FName(TEXT("Hoge_1300"))); Names.Add(FName(TEXT("Hoge_9999"))); Names.Add(FName(TEXT("Hoge9999"))); for (const auto& Name : Names) { UE_LOG(LogWindows, Log, TEXT("◆%s"), *Name.ToString()); UE_LOG(LogWindows, Log, TEXT(" PlainAnsiString=%s (%p)"), *FString(Name.GetPlainANSIString()), Name.GetPlainANSIString()); UE_LOG(LogWindows, Log, TEXT(" [FNameEntry]")); UE_LOG(LogWindows, Log, TEXT(" ComparisonIndex=%d"), Name.GetComparisonIndex()); UE_LOG(LogWindows, Log, TEXT(" [ComparisonEntry]")); UE_LOG(LogWindows, Log, TEXT(" Address=%p"), Name.GetComparisonNameEntry()); UE_LOG(LogWindows, Log, TEXT(" isWide=%d"), Name.GetComparisonNameEntry()->IsWide()); UE_LOG(LogWindows, Log, TEXT(" DisplayIndex=%d"), Name.GetDisplayIndex()); UE_LOG(LogWindows, Log, TEXT(" [DisplayEntry]")); UE_LOG(LogWindows, Log, TEXT(" Address=%p"), Name.GetDisplayNameEntry()); UE_LOG(LogWindows, Log, TEXT(" isWide=%d"), Name.GetDisplayNameEntry()->IsWide()); UE_LOG(LogWindows, Log, TEXT(" Number=%d"), Name.GetNumber()); } 実行結果を見ると、Hoge_10, Hoge_1200, Hoge_1300, Hoge_999で見事に同一のPlainAnsiStringが返ってきているのが分かる(★の部分) LogWindows: ◆Hoge_ LogWindows: PlainAnsiString=Hoge_ (000000021299B988) LogWindows: [FNameEntry] LogWindows: ComparisonIndex=1029720 LogWindows: [ComparisonEntry] LogWindows: Address=000000021299B978 LogWindows: isWide=0 LogWindows: DisplayIndex=1029720 LogWindows: [DisplayEntry] LogWindows: Address=000000021299B978 LogWindows: isWide=0 LogWindows: Number=0 LogWindows: ◆Hoge_0000 LogWindows: PlainAnsiString=Hoge_0000 (000000021299B9A0) LogWindows: [FNameEntry] LogWindows: ComparisonIndex=1029721 LogWindows: [ComparisonEntry] LogWindows: Address=000000021299B990 LogWindows: isWide=0 LogWindows: DisplayIndex=1029721 LogWindows: [DisplayEntry] LogWindows: Address=000000021299B990 LogWindows: isWide=0 LogWindows: Number=0 LogWindows: ◆Hoge_0001 LogWindows: PlainAnsiString=Hoge_0001 (000000021299B9C0) LogWindows: [FNameEntry] LogWindows: ComparisonIndex=1029722 LogWindows: [ComparisonEntry] LogWindows: Address=000000021299B9B0 LogWindows: isWide=0 LogWindows: DisplayIndex=1029722 LogWindows: [DisplayEntry] LogWindows: Address=000000021299B9B0 LogWindows: isWide=0 LogWindows: Number=0 LogWindows: ◆Hoge_10 LogWindows: PlainAnsiString=Hoge (000000021299B9E0)…★ LogWindows: [FNameEntry] LogWindows: ComparisonIndex=1029723 LogWindows: [ComparisonEntry] LogWindows: Address=000000021299B9D0 LogWindows: isWide=0 LogWindows: DisplayIndex=1029723 LogWindows: [DisplayEntry] LogWindows: Address=000000021299B9D0 LogWindows: isWide=0 LogWindows: Number=11 LogWindows: ◆Hoge_1200 LogWindows: PlainAnsiString=Hoge (000000021299B9E0)…★ LogWindows: [FNameEntry] LogWindows: ComparisonIndex=1029723 LogWindows: [ComparisonEntry] LogWindows: Address=000000021299B9D0 LogWindows: isWide=0 LogWindows: DisplayIndex=1029723 LogWindows: [DisplayEntry] LogWindows: Address=000000021299B9D0 LogWindows: isWide=0 LogWindows: Number=1201 LogWindows: ◆Hoge_1300 LogWindows: PlainAnsiString=Hoge (000000021299B9E0)…★ LogWindows: [FNameEntry] LogWindows: ComparisonIndex=1029723 LogWindows: [ComparisonEntry] LogWindows: Address=000000021299B9D0 LogWindows: isWide=0 LogWindows: DisplayIndex=1029723 LogWindows: [DisplayEntry] LogWindows: Address=000000021299B9D0 LogWindows: isWide=0 LogWindows: Number=1301 LogWindows: ◆Hoge_9999 LogWindows: PlainAnsiString=Hoge (000000021299B9E0)…★ LogWindows: [FNameEntry] LogWindows: ComparisonIndex=1029723 LogWindows: [ComparisonEntry] LogWindows: Address=000000021299B9D0 LogWindows: isWide=0 LogWindows: DisplayIndex=1029723 LogWindows: [DisplayEntry] LogWindows: Address=000000021299B9D0 LogWindows: isWide=0 LogWindows: Number=10000 LogWindows: ◆Hoge9999 LogWindows: PlainAnsiString=Hoge9999 (000000021299B9F8) LogWindows: [FNameEntry] LogWindows: ComparisonIndex=1029724 LogWindows: [ComparisonEntry] LogWindows: Address=000000021299B9E8 LogWindows: isWide=0 LogWindows: DisplayIndex=1029724 LogWindows: [DisplayEntry] LogWindows: Address=000000021299B9E8 LogWindows: isWide=0 LogWindows: Number=0 FNameはハッシュ付き文字列として実装されている。文字列はFNameの共用領域に格納され、各FNameインスタンスはその文字列格納領域へのインデックス=ハッシュを保持してる。FNameの同士の比較は互いのハッシュの比較、つまり整数の比較に還元されるため、通常の文字列比較より速いって仕掛けなんですな。 ただ、このハッシュ生成方法がちょっと曲者で、文字列がアンダースコア+ゼロ詰めされていない数値で終わっていたら、その部分を除いた文字列を共用領域に格納し、数値は各FNameインスタンスで保持するという方法なのだ。割と最近のバージョンアンプで変わったらしい(知人曰く4.12あたりで変わった気がすると)。なかなか破壊的な変更をしてくださりやがるな!言葉だと分かりにくいので図を作ってみた。 図を踏まえつつ改めて実行結果を見てみると、条件に合致するHoge_10, Hoge_1200, Hoge_1300, Hoge_999の中身が、その通りになっている事がお分かりいただけよう。Numberが実際の数値+1されているのは、これまた仕様で、数値分割条件を満たさないFNameインスタンス(Number == 0)との区別の為っぽい。 UE4では生成されたオブジェクトのインスタンスに対し、オブジェクト名+連番の名前を自動付与するため、大規模な開発になるとFName文字列ストアの肥大化が無視できなくなり、保持方法を変更したのだと思われる。 こんな格納の仕方で大丈夫なの!?と思うが、ふつーにFNameを使う分には何の問題もない。や、正確には大丈夫じゃなかったからこの記事書いてる訳だけど、文字列の生ポインタ取ってこねくり回すような事をしなければ大丈夫。FName文字列に対して低レベルな操作を行いたい時は、ToString()関数で生成したFStringに対して行う事をオススメする。エンジンのコードを見てもらうと分かるが、ComparisonIndexの文字列にアンダースコアと数値をくっつけて元の文字列を復元してやがるので(笑) ちなみに、実行結果内のDisplayIndexというのは、名前の通り表示用の文字列へのインデックス。簡単に言えば、FName生成時に与えられた文字列のインデックスである。FNameは基本的にcase-preserving(内部的には大文字小文字を区別するが対外的には区別せずに扱う)なので、比較用と表示用で別々の文字列を持つ必要がある訳だ。知らずに使ってると、これも地味にハマりポイントかも。 FName abc(TEXT("abc")); FName ABC(TEXT("ABC")); UE_LOG(LogWindows, Log, TEXT("%s %s %s"), *abc.ToString(), (abc == ABC ? TEXT("==") : TEXT("!=")), *ABC.ToString()); 念のため上記コードで確認したら、LogWindows: abc == ABCとなった。 掘ってみるとFNameには結構罠があるので注意が必要だ。 Comments see here https://web-jaxxliberty.com/ 1 | Floydwaync | 2025-08-11 08:21 | reply What Sets handofgod.tech Apart HOG Based Yield Stake HOG earn GHOG and monitor price through the dashboard Sanctum and Garden Each realm offers unique pool rewards and supply multipliers AI Powered Use Hog OS and AI agent tools to guide portfolio strategy Liquidity Pools Participate in Hand of God DeFi with stablecoin farming and lock unlock support Stake with divine logic at https://handofgod.tech 2 | RobertWef | 2025-08-14 16:49 | reply click to find out more https://astrol.pro/ 3 | Melvinlem | 2025-08-17 09:04 | reply why not look here https://extended-exchange.cc/ 4 | Jamesalicy | 2025-08-18 23:54 | reply Envio mis saludos a todos los cazadores de premios! Muchos jugadores eligen casinos sin licencia en espana porque ofrece mГЎs libertad y anonimato que los sitios regulados. La seguridad de casinos sin licencia en espana se basa en encriptaciГіn avanzada y protocolos internacionales. <a href=п»їhttps://casinosonlinesinlicencia.xyz/></a> Con casinos sin licencia en espana puedes encontrar tragaperras exclusivas y juegos de casino en vivo sin trabas. Una de las ventajas de casinos sin licencia espaГ±a es que puedes registrarte rГЎpido sin verificaciones extensas. La seguridad de casinos sin licencia espaГ±a se basa en encriptaciГіn avanzada y protocolos internacionales. ВїQuieres apostar sin lГmites? casinos sin licencia espaГ±a te permite jugar con depГіsitos y retiros flexibles. Casinosonlinesinlicencia: juega desde tu mГіvil - http://casinosonlinesinlicencia.xyz/# Que disfrutes de increibles victorias ! casinos sin licencia en espaГ±a 5 | KendallDouts | 2025-08-26 11:54 | reply ¡Mis más cordiales saludos a todos los visitantes habituales del casino ! La diferencia de casinos sin licencia espaГ±ola estГЎ en que no tienes que esperar, solo juegas y disfrutas. <a href=п»їhttps://casinossinlicencia.xyz/></a> Nada se compara con la intensidad de casinos sin licencia espaГ±ola, donde las reglas son mГЎs flexibles. Cada dГa mГЎs personas confГan en casinos sin licencia espaГ±ola para disfrutar de apuestas rГЎpidas y seguras. La experiencia de jugar en mejores casinos sin licencia en espaГ±a es Гєnica, llena de adrenalina y sin restricciones molestas. ВїQuieres anonimato y emociГіn al mismo tiempo? mejores casinos sin licencia en espaГ±a lo hace posible sin complicaciones. Los apostadores expertos saben que mejores casinos sin licencia en espaГ±a ofrece cuotas mejores que los regulados. Vive la emociГіn en casinos sin licencia espaГ±a sin lГmites ni front… - https://casinossinlicencia.xyz/# ¡Que aproveches magníficas premios ! 6 | Danielbus | 2025-08-28 03:37 | reply navigate to this site https://toast-wallet.io 7 | Davidwhisy | 2025-09-09 12:38 | reply содержание https://kra41at.at 8 | ChrisUnula | 2025-09-28 07:51 | reply Узнать больше https://kra41a.at 9 | Sammygow | 2025-09-28 07:51 | reply читать https://ros18.ru/catalog/polikarbonat/sotovyy-polikarbonat/sotovyy-polikarbonat-kinplast/ 10 | JosephStake | 2025-11-11 03:19 | reply ?Brindemos por cada buscador de emociones fuertes ! La comunidad destaca que MostBet casino mantiene cuotas competitivas en distintos deportes. <a href=http://estetiplan.es></a> Sus herramientas facilitan analizar estadГsticas antes de apostar. Esto ayuda a tomar decisiones mГЎs seguras. Muchos jugadores consideran que https://www.estetiplan.es ofrece una experiencia fluida para apostar sin complicaciones. Su diseГ±o intuitivo permite adaptarse rГЎpidamente incluso a quienes son nuevos. AdemГЎs, la variedad de opciones hace que cada sesiГіn sea distinta. Novedades destacadas dentro de https://estetiplan.es/ - https://www.estetiplan.es ?Que la suerte te sonria con que obtengas espectaculares jackpots esplendidos ! 11 | RaymondEvorn | 2025-12-05 03:50 | reply ?Celebremos a cada hallador de caudales ! Jugar en casinoretirosinverificacion permite acceder a una experiencia rГЎpida y privada sin procesos complicados. <a href=http://casinoretirosinverificacion.com/#></a> Muchos jugadores optan por estas opciones debido a la libertad que ofrecen plataformas como casino sin kyc. Gracias a esta flexibilidad, cada sesiГіn se vuelve mГЎs cГіmoda al usar servicios como casino crypto sin kyc. Jugar en casinos sin verificacion permite acceder a una experiencia rГЎpida y privada sin procesos complicados. Muchos jugadores optan por estas opciones debido a la libertad que ofrecen plataformas como https://casinoretirosinverificacion.com/. Gracias a esta flexibilidad, cada sesiГіn se vuelve mГЎs cГіmoda al usar servicios como casinos sin kyc. Casinos sin kyc, apuesta sin complicaciones - http://casinoretirosinverificacion.com/# ?Que la suerte te beneficie con aguardandote magnificos movidas triunfantes ! 12 | ScottJed | 2025-12-05 08:52 | reply Name E-Mail Website 人間の証明として、ボックス内の全ての文字を入力してください。 この項目は空のままにして下さい:Preview Comment blog/2017/2017-01-20.1484979746.txt.gz 最終更新: 2017-01-21 15:22by Decomo