Winapi 是否将UTF-16转换为代码页并删除unicode文本方向控制字符? 短版 给出:1/16/2006 2∶30∶11ᴘᴍ 如何获取:2006年1月16日下午2:30:11 而不是:?1/?16/?2006?2:30:11??? 背景
我有一个Unicode(UTF-16)编码字符串示例:Winapi 是否将UTF-16转换为代码页并删除unicode文本方向控制字符? 短版 给出:1/16/2006 2∶30∶11ᴘᴍ 如何获取:2006年1月16日下午2:30:11 而不是:?1/?16/?2006?2:30:11??? 背景,winapi,unicode,codepages,Winapi,Unicode,Codepages,我有一个Unicode(UTF-16)编码字符串示例: U+200e U+0031 U+002f U+200e U+0031 U+0036 U+002f U+200e U+0032 U+0030 U+0030 U+0036 U+0020 U+200f U+200e U+0032 U+2236 U+0033 U+0030 U+2236 U+0031 U+0031 U+0020 U+1d18 U+1d0d [LTR] 1 / [LTR] 1 6
U+200e U+0031 U+002f U+200e U+0031 U+0036 U+002f U+200e U+0032 U+0030 U+0030 U+0036 U+0020 U+200f U+200e U+0032 U+2236 U+0033 U+0030 U+2236 U+0031 U+0031 U+0020 U+1d18 U+1d0d
[LTR] 1 / [LTR] 1 6 / [LTR] 2 0 0 6 [RTL] [LTR] 2 ∶ 3 0 ∶ 1 1 ᴘ ᴍ
以一种稍微易于阅读的形式是:
LTR1/LTR16/LTR2006 RTLLTR2∶30∶11ᴘᴍ
您应该看到的实际最终文本是:
我目前使用Windows函数wideChartMultiByte将UTF-16转换为本地代码页:
WideCharToMultiByte(CP_ACP, 0, text, length, NULL, 0, NULL, NULL);
当我这样做的时候,文本显示为:
?1/?16/?2006 ??2:30:11 ??
我不控制Unicode文本方向标记的存在;但显然,当我将Unicode转换为(例如)ISO-8859-1时,这些字符是不相关的,毫无意义,我希望可以删除这些字符
是否有Windows功能(例如,FoldString
,WideCharToMultiByte
)可以指示删除这些不可映射的不可打印字符
2006年1月16日2∶30∶11ᴘᴍ
这让我们很接近
如果函数这样做,删除目标代码页中没有表示形式的非打印字符,我们将得到:
2006年1月16日2∶30∶11ᴘᴍ
当转换为ISO-8859-1时,它变为:
2006年1月16日2?30?11
这是因为其中一些字符没有准确映射到ISO-8859-1:
2006年1月16日2U+223630U+223611 U+1d18U+1d0d
2006年1月16日比率11小型资本p小型资本M
但是,当您看到它们时,它们最适合映射到以下对象似乎并不合理:
- 原件:
1/16/2006 2∶30∶11ᴘᴍ代码>
- 映射:
1/16/2006下午2:30:11
- 2006年1月16日2?30?11
- ?1/?16/?2006?2:30:11
- U+00BAº→ o()→ (小写拉丁字母o,上标)
- U+FF0F/→ / () → (索利多金币,宽)
- U+00BC¼→ 1/4()
- U+2033“→ ′′ ()
- U+FE64:﹤ → 没有Win32 API函数来执行您要求的操作。您需要手动从字符串中删除不需要的字符,并根据需要替换未映射的字符,然后将字符串传递到
。您正在处理一个非常特定的用例,因此手动进行修改应该是相当直接的。WideCharToMultiByte()