我尝试在Delphi中读取包含重音符的字符串。 我不知道他的字符串的真实编码。 我想这是UNICODE。
我的问题在于口音。
当我把它读作UNICODE时,
char é
显示为e
(2个字符:e
和'
)
è
同样的问题
被视为e`
(2个字符:e
和`
)
为什么?
感谢您的帮助。
答案 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;