ローカライザーのメモ。 ゲーム保存問題ケース

「ゲームは保存されません! どうする?!!! "

クレイジー

「それは私のためにすべてを保ちます。」

吸血鬼

「保存は機能しません、一体何ですか?」

ゾンビ

「すべてうまくいきます。誰かが曲がっただけです:)」

ダンテ

ゲームフォーラムから...



そのような小競り合いは数ページにわたって広がり、言葉の戦いの参加者が実際の生活の中で出会った場合、おそらく虐殺があったでしょう。

あるものはすべてうまくいくのに対し、他の人は正直に購入したライセンス付きディスクがそのような困難で達成された結果を維持することが不可能であることを喜んでいる秘密は何ですか?



すべてが非常に簡単です。 ロシア語とWindows。 最新のゲームはすべて、ユーザーデータを操作するための規則に従って、結果をユーザーディレクトリに保存します。 通常、これはユーザーの個人ディレクトリにある「マイドキュメント」フォルダーです。 これが問題の始まりであり、2つです。 まず、ロシア語版のWindowsでは、英語版のマイドキュメントとは異なり、マイドキュメントフォルダーの名前はロシア語です。 次に、Windowsでプロファイルを作成するユーザーは、ロシア語またはその他のキリル文字を使用してプロファイルを作成できます。 原則として、それが母国語であれば論理的です。

その結果、Blablabla GameはDocuments and Settings \ Vasya Pupkin \ My Documents \ Blablabla Game \ Savesなどのフォルダーに実績を保存しようとします

問題は、欧米のゲーム開発者は、ファイルを保存するパスに標準のASCIIセット以外の文字が含まれている可能性があることを推測さえしないことが多いことです。

コードを掘り下げます。

ユーザーディレクトリは通常、SHGetKnownFolderPath関数を使用して取得します。 運がよく、開発者がUnicodeバージョンの関数を使用した場合、出力は正しいUnicode文字列になります。 しかし、その後、楽しみが始まります。 開発者はテキストのエンコードに関係なくこの行を完全に処理するため、これらは通常の英語の文字であるとしばしば信じています。

Unicode文字には、文字ごとに2バイトが含まれます。 16進数の文字列は次のとおりです。



FEFF 0022 0043 003A-005C 0044 006F 0063-0075 006D 0065 006E-0074 0073 0020 0061 ?"C:\Documents a

006E 0064 0020 0053-0065 0074 0074 0069-006E 0067 0073 005C-0412 0430 0441 044F nd Settings\

0020 043F 0443 043F-043A 0438 043D 005C-041C 043E 0438 0020-0414 043E 043A 0443 \

043C 0435 043D 0442-044B 0022 0020 000D-000A 0000 0000 0000 0000 0000 0000 0000 " ♪◙









エラーは、この行の後続の処理にあります。 多くの場合、開発者は、明らかに古いコードを使用して、2バイトのUnicode文字列をシングルバイトASCIIに変換してさらに作業します。 そして、多くの場合、彼らはエラーでそれを行います。 たとえば、コーディングなし。

.text:00A3BBE0 mov edx, [esp+unicodeSrc]

.text:00A3BBE4 mov al, [edx]

.text:00A3BBE6 test al, al

.text:00A3BBE8 mov ecx, [esp+ansiiDest]

.text:00A3BBEC jz short loc_A3BC0F

.text:00A3BBF3 loc_A3BBF3:

.text:00A3BBF3 cmp esi, 1

.text:00A3BBF6 jle short loc_A3BC0E

.text:00A3BBFC add edx, 2

.text:00A3BBFF mov [ecx], al

.text:00A3BC02 mov al, [edx];!!!! !!!!

.text:00A3BC04 add ecx, 1

.text:00A3BC07 sub esi, 1

.text:00A3BC0A test al, al

.text:00A3BC0C jnz short loc_A3BBF3









このコードは何をしますか? Unicode文字列の最初のバイトを取得して保存するだけで、エンコード機能について完全に気になります。 そして、英語コード0065-文字 "S"の場合、出力は同じ "S" 65であり、ロシア語の文字 "n" 0414の場合

14個のみが残ります。これはサービスコードであり、ファイル名には使用できません。

次に、このような破損した行が回り、ファイルを保存するときが来ると、パス名の文字が正しくないためにファイルを作成できないことは明らかです。

これはほんの一例です。 Unicodeの誤用の例は非常に多くあります。



したがって、開発者への要求はユニコードを正しく使用することであり、製品が他の国の市場に持ち込まれた場合に備えて、自分で間違いを探すのに多くの時間を費やす必要があります。



ゲームに問題がない場合は、ユーザーにアドバイスします。ロシア語の文字を使用せずにWindowsプロファイルを作成し、「マイドキュメント」フォルダーを英語の別のフォルダーにリダイレクトします。



All Articles