2

アプリで Unicode テキストをレンダリングするためのテクスチャ アトラスを生成しています。ソース テキストは ANSI コードページ (1250、1251、1254、1257 など) で保存されます。各 ANSI コードページからすべてのシンボルを生成できるようにしたいと考えています。

私が期待するコードの概要は次のとおりです。

for I := 0 to 255 do
begin
  anChar := AnsiChar(I); //obtain AnsiChar

  //Apply codepage without converting the chars
  //<<--- this part does not work, showing:
  //"E2033 Types of actual and formal var parameters must be identical"
  SetCodePage(anChar, aCodepages[K], False);

  //Assign AnsiChar to UnicodeChar (automatic conversion)
  uniChar := anChar;

  //Here we get Unicode character index
  uniCode := Ord(uniChar);
end;

上記のコードは機能しません (E2033)。それが適切な解決策であるかどうかはまったくわかりません。おそらく、もっと短いバージョンがあります。

特定のコードページを念頭に置いて AnsiChar を Unicode に変換する適切な方法は何ですか?

4

3 に答える 3

3

私は次のようにします:

function AnsiCharToWideChar(ac: AnsiChar; CodePage: UINT): WideChar;
begin
  if MultiByteToWideChar(CodePage, 0, @ac, 1, @Result, 1) <> 1 then
    RaiseLastOSError;
end;

本質的に文字操作に文字列を使用することは避けるべきだと思います。サポートする必要があるコード ページが事前にわかっている場合は、配列定数として表されるルックアップ テーブルに変換をハード コードできます。

ANSI コード ページで定義されているすべての文字は、Basic Multilingual Plane の Unicode 文字にマップされるため、単一の UTF-16 文字で表されることに注意してください。したがって、上記のコードのサイズの仮定。

ただし、あなたが作成していて、この答えが持続するという前提は、1 バイトが ANSI 文字セットの文字を表すということです。これは、1252 のような 1 バイトの西洋文字セットなど、多くの文字セットにとって有効な仮定です。しかし、2 バイト文字セットである 932 (日本語)、949 (Koren) などの文字セットがあります。これらのコードページでは、アプローチ全体が崩壊します。私の推測では、シングルバイト文字セットのみをサポートしたいということです。

クロスプラットフォーム コードを記述している場合はMultiByteToWideCharUnicodeFromLocaleChars.

于 2013-06-27T08:49:57.817 に答える
0

うまく機能していることがわかったコードは次のとおりです。

var
  I: Byte;
  anChar: AnsiString;
  Tmp: RawByteString;
  uniChar: Char;
  uniCode: Word;
begin
  for I := 0 to 255 do
  begin
    anChar := AnsiChar(I);
    Tmp := anChar;
    SetCodePage(Tmp, aCodepages[K], False);
    uniChar := UnicodeString(Tmp)[1];
    uniCode := Word(uniChar);

    <...snip...>
  end;
于 2013-06-27T08:42:55.023 に答える