我正在生成纹理地图集,以在我的应用程序中呈现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的正确方法是什么?

最佳答案

我会这样做:

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


我认为您应该避免对本质上的字符操作使用字符串。如果您预先知道需要支持哪些代码页,则可以将转换硬编码为以数组常量表示的查找表。

请注意,在ANSI代码页中定义的所有字符都从基本多语言平面映射到Unicode字符,因此由单个UTF-16字符表示。因此,上面代码的大小假设。

但是,您所做的假设以及该答案仍然存在的假设是,单个字节代表ANSI字符集中的字符。这是许多字符集的有效假设,例如单字节西方字符集(例如1252)。但是有些字符集(例如932(日语),949(科伦)等)是双字节字符集。对于这些代码页,您的整个方法都无法实现。我的猜测是只希望支持单字节字符集。

如果要编写跨平台代码,则可以将MultiByteToWideChar替换为UnicodeFromLocaleChars

关于delphi - 如何使用特定的CodePage将AnsiChar转换为UnicodeChar?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17338460/

10-11 23:07