口音编码

时间:2011-10-12 06:18:23

标签: delphi unicode utf-16

我尝试在Delphi中读取包含重音符的字符串。 我不知道他的字符串的真实编码。 我想这是UNICODE。

我的问题在于口音。

当我把它读作UNICODE时, char é显示为e(2个字符:e'

è同样的问题 被视为e`(2个字符:e`

为什么?

感谢您的帮助。

3 个答案:

答案 0 :(得分:4)

Unicode有两种合成模式。这是in this ICU document的解释。显然,您阅读的字符串使用分解模式(因此é编码为e´)。默认情况下,Windows使用预合成模式,其中é被编码为单独的字符。

如果要比较字符串,则从一种模式转换为另一种模式是有意义的。但是,没有统一的方法可以做到这一点。 ICU文件提供了一些帮助。

如果正确,合成模式应该在屏幕上没有任何区别。

更新

这个MSDN article解释了如何在Windows上规范化Unicode字符串。

答案 1 :(得分:2)

如果您的问题确实是错误的合成模式,正如Rudy所猜测的那样,那么WideCharToMultiByte函数可以帮助您将字符串转换为预合成模式。请参阅WideCharToMultiByte帮助末尾的注释“WC_COMPOSITECHECK和相关标志”。

答案 2 :(得分:1)

出现单独的变音标记的可能原因是Unicode中的数据丢失 - > ANSI转换。这是一个代码示例(Delphi 2009):

type
  Str1252 = type AnsiString(1252);

var
  S, S2: string;
  S1: Str1252;

begin
  SetLength(S, 2);
  S[1]:= Char($0041);
  S[2]:= Char($0301);
  S1:= S;   // Ord(S1[2]) = $B4; the compiler issues warning W1058:
            // Implicit string cast with potential data loss from 'string' to 'Str1252'
  S2:= S1;  // Ord(S2[2]) = $B4
  ShowMessage(S + ' --> ' + S2);  // Á --> A´
end;