重音编码
我尝试在 Delphi 中读取包含重音符号的字符串。 我不知道字符串的真正编码。 我想它是UNICODE。
我的问题是口音。
当我将其读取为 UNICODE 时, 字符é
显示为e
(2个字符:e
和'
)
è有同样的问题
它被视为e`
(2个字符:e
和`
)
为什么呢?
感谢您的帮助。
I try to read a string containing accents in Delphi.
I don t know the real encoding of he string.
I suppose it is UNICODE.
My problem is with the accents.
When I read it as UNICODE,
the char é
is shown as e
(2 chars : e
and '
)
same problem for è
which is seen as e`
(2 chars : e
and `
)
Why that ?
Thanks for your help.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
Unicode 有两种组合模式。 本 ICU 文档对此进行了解释。显然,您正在读取的字符串使用分解模式(因此
é
被编码为e
和´
)。默认情况下,Windows 使用预组合模式,其中é
被编码为单独的字符。如果您想比较字符串,从一种模式转换为另一种模式是有意义的。然而,没有统一的方法来做到这一点。 ICU文件提供了一些帮助。
如果正确完成,合成模式应该不会在屏幕上产生任何差异。
更新
此MSDN 文章 详细解释了如何在 Windows 上标准化 Unicode 字符串。
Unicode has two composition modes. This is explained in this ICU document. Apparently the string you have been reading uses decomposition mode (so
é
is encoded ase
and´
). Windows, by default, uses precomposed mode, whereé
is encoded as a separate character.Converting from one mode to the other makes sense if you want to compare strings. There is, however, no uniform way to do this. The ICU document gives some help.
The composition mode should, if done properly, not make any difference on the screen.
Update
This MSDN article explains a little more about how to normalize Unicode strings on Windows.
如果您的问题确实是错误的组合模式,正如鲁迪所猜测的那样,那么 WideCharToMultiByte 函数可以帮助您将字符串转换为预组合模式。请参阅 WideCharToMultiByte 帮助末尾的注释“WC_COMPOSITECHECK 和相关标志”。
If your problem is indeed the wrong composition mode, as guessed by Rudy, then WideCharToMultiByte function may help you convert the string to precomposed mode. See note "WC_COMPOSITECHECK and related flags" at the end of WideCharToMultiByte help.
出现单独的变音符号的一个可能原因是 Unicode 中的数据丢失 -> 。 ANSI 转换。这是一个代码示例(Delphi 2009):
A probable reason for appearance of the separate diacritical marks is data loss in Unicode -> ANSI conversion. Here is a code sample (Delphi 2009):