重音编码

发布于 2024-12-09 12:34:14 字数 292 浏览 0 评论 0原文

我尝试在 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

撧情箌佬 2024-12-16 12:34:14

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 as e 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.

回首观望 2024-12-16 12:34:14

如果您的问题确实是错误的组合模式,正如鲁迪所猜测的那样,那么 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.

九局 2024-12-16 12:34:14

出现单独的变音符号的一个可能原因是 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;

A probable reason for appearance of the separate diacritical marks is data loss in Unicode -> ANSI conversion. Here is a code sample (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;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文