Winapi 是否将UTF-16转换为代码页并删除unicode文本方向控制字符? 短版 给出:1/16/2006 2∶30∶11ᴘᴍ 如何获取:2006年1月16日下午2:30:11 而不是:?1/?16/?2006?2:30:11??? 背景

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

我有一个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      /  [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
Unicode有这个概念 Unicode已经有了用“普通”字符替换“花式”字符的概念

  • U+00BAº→ o()→ (小写拉丁字母o,上标)
  • U+FF0F/→ / () → (索利多金币,宽)
  • U+00BC¼→ 1/4()
  • U+2033“→ ′′ ()

  • U+FE64:﹤ → 没有Win32 API函数来执行您要求的操作。您需要手动从字符串中删除不需要的字符,并根据需要替换未映射的字符,然后将字符串传递到
    WideCharToMultiByte()
    。您正在处理一个非常特定的用例,因此手动进行修改应该是相当直接的。