gpt4 book ai didi

winapi - 如何在编码之间获得最适合的 unicode 字符映射

转载 作者:行者123 更新时间:2023-12-02 08:38:55 25 4
gpt4 key购买 nike

我有一个 UTF-16 字符串,其中包含一些无法在本地 Windows-1252 代码页中直接表示的字符:

6/23/2011 9:23:44 ᴀᴍ

我用WideCharToMultiByte将字符串转换为本地代码页(我的北美计算机上的 Windows-1252):

WideCharToMultiByte(
CP_ACP, //target CodePage
0, //flags
Source, //my string, e.g. "6/23/2011 9:23:44 ᴀᴍ"
length, //length in characters, e.g. 20
buffer, //destination where to put the string
bufferSize,
null, //optional, character to use when character cannot be represented
null); //optional, out boolean that indicates if any character could not be represented

字符串输出为:

6/23/2011 9:23:44 ??

字面上用问号 0x3f = "?" 表示不可表示的字符。

查看原始字符串“ᴀᴍ”中的字符,这两个字符是:

  • U+1D00:拉丁字母小写大写 A
  • U+1D0D:拉丁字母小写大写 M

unicode 标准表示 these are phonetic extensions, and for general text: use regular Latin 。对我来说这意味着文本应该转换为:

6/23/2011 9:23:44 AM

6/23/2011 9:23:44 am
<小时/>

另一个例子可以是6′2″:

  • U+2032:素数
  • U+2033:双素数

当我将该字符串转换为 Windows-1252 时,它会变成 6'2?(撇号,?)。

Unicode entry for Prime列出撇号作为替代:

2032   ′   PRIME
= minutes, feet
→ 0027 ' apostrophe
→ 00B4 ´ acute accent
→ 02B9 ʹ modifier letter prime

即使目标代码页中不存在 primeWideChartoMultiByte 也会将其转换为最接近的等效项之一(即撇号) 。

另一方面双素数:

2033   ″   DOUBLE PRIME
= seconds, inches
→ 0022 " quotation mark
→ 02BA ʺ modifier letter double prime
→ 201D ” right double quotation mark
≈ 2032 ′ 2032 ′

没有映射到任何内容 (?),但我的 Windows-1252 编码中存在其他一些项目:

Character                                 Unicode  Windows-1252
========================================= ======= ============
″ double prime U+2032 -
" quotation mark U+0022 0x22
ʺ modifier letter double prime U+02BA -
” right double quotation mark U+201D 0x94

′ prime U+2032 -
' apostrophe U+0027 0x27
´ acute accent U+00B4 0xb4
ʹ modifier letter prime U+02B9

即使在最坏的情况下,它分解原始双素数素数 素数:素数有一个等效 - 因为它已经使用了它。

对于其他字符也有映射:

Character                                 Unicode  Windows-1252
========================================= ======= ============
ᴀ Latin Letter Small Capital A U+1D00 -
A Latin Capital Letter A U+0041 0x41
a Latin Small Letter A U+0061 0x61

ᴍ Latin Letter Small Capital M U+1D0D -
M Latin Capital Letter M U+004D 0x4d
m Latin Small Letter M U+006D 0x6d

如何使 WideChartoMultiByte 在编码之间进行最佳匹配映射?

最佳答案

我认为您无法更改 WideCharToMultiByte() 的结果。如果您足够关心尝试不同的解决方案 ICU可能会给你不同的结果。

就我个人而言,我还没有尝试过,所以我不能保证结果(谁需要从 Unicode 转换,无论如何?)但我相信你应该练习 ICU Converters 。它的好处是支持 Unicode 6.0(无论如何,您可能不需要它)。

关于winapi - 如何在编码之间获得最适合的 unicode 字符映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6455804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com