Winapi IMultiLanguage2::ConvertStringFromUnicode-如何避免复合前缀?

Winapi IMultiLanguage2::ConvertStringFromUnicode-如何避免复合前缀?,winapi,unicode,character-encoding,utf-16,Winapi,Unicode,Character Encoding,Utf 16,我正在使用IMultimage2::ConvertStringFromUnicode从UTF-16进行转换。对于某些语言(日语、汉语、韩语),我得到了一个转义序列(例如代码页50225(ISO-2022韩语)的0x1B、0x24、0x29、0x43)。WideChartMultiByte表现出相同的行为 我正在构建一个MIME消息,因此编码在头本身中指定,转义前缀按原样显示 有没有不带前缀的转换方法 谢谢大家! 我觉得这里没有什么问题。这是以下文件中的有效字节序列: 用于指定字符集的转义序列的形

我正在使用IMultimage2::ConvertStringFromUnicode从UTF-16进行转换。对于某些语言(日语、汉语、韩语),我得到了一个转义序列(例如代码页50225(ISO-2022韩语)的
0x1B、0x24、0x29、0x43)。WideChartMultiByte表现出相同的行为

我正在构建一个MIME消息,因此编码在头本身中指定,转义前缀按原样显示

有没有不带前缀的转换方法


谢谢大家!

我觉得这里没有什么问题。这是以下文件中的有效字节序列:

用于指定字符集的转义序列的形式为ESC I[I..]F,其中0x20–0x2F范围内有一个或多个中间I字节,0x40–0x7F范围内有一个最终F字节。(范围0x30–0x3F保留给私人使用的F字节。)I字节标识字符集的类型及其要指定的工作集,而F字节标识字符集本身。

代码:ESC$)F
十六进制:1B 24 29 F
缩写:G1DM4
名称:G1指定多字节94集F
效果:选择要用于G1的94n字符集

由于F是0x43(C),该字节序列告诉解码器切换到ISO-2022-KR:

使用ISO/IEC 2022机制的字符编码包括:

ISO-2022-KR。韩语编码。
ESC$)C切换到,以前命名为KS C 5601-1987(每个字符2字节)[指定为G1]

在这种情况下,必须将
iso-2022-kr
指定为MIME
内容类型
或-encoded头中的字符集。但是,ISO 2022解码器在解码时仍必须能够动态切换字符集,因此,数据包含到韩语字符集的初始切换序列是有效的

有没有不带前缀的转换方法

不适用于
immultilanguage2
WideCharToMultiByte()
,它们不知道您将如何使用它们的输出,因此它们包含韩语字符集的初始切换序列是有道理的-因此解码器不需要从MIME(或其他源)访问字符集信息仍然知道最初使用什么字符集


当您将数据放入MIME消息时,当您将MIME字符集设置为
iso-2022-kr
时,必须手动去除字符集开关序列。如果您不想手动将其剥离,则必须找到(或写入)一个不输出初始开关序列的Unicode编码器。

这是一个令人费解的问题-原来转义序列是必要的。问题在于我的代码使用Trim()Delphi函数修剪名称和地址,该函数修剪所有小于或等于空格(0x20)的字符;其中包括转义字符(0x1B)


切换到我自己的修剪功能,只删除空格修复了问题。

实际问题是什么?如果这就是API返回的内容,那么这就是您的输入Unicode字符串在ISO-2022韩文中实际转换为的内容。您必须在MIME
内容类型
标题中指定
charset=iso-2022-kr
。问题是不需要前缀。如果我使用Outlook(IConverterSession)创建MIME文件,MIME头(to)的值与我的值完全相同,减去4字节前缀。Outlook和我的代码都在标题值中指定“iso-2022-kr”。我可以删除前缀(可以找到可能的前缀列表,例如,at),但我更希望使用imultillanguage来完成这项工作。根据ISO 2022,无论是否需要,它仍然有效。如果Outlook不能正确处理它,那么Outlook就坏了。雷米,没有人说它是无效的。我想说的是,由于字符集是显式指定的,所以不需要它。Outlook是否损坏也无关紧要,因为我无法真正修复Outlook中的“问题”,并将修复分发给大约十亿Outlook用户。
imultillanguage
WideCharToMultiByte()
不知道如何使用它们的输出,因此,它们必须包含前缀,以便解码器知道要使用什么字符集。将数据放入MIME头/体时,如果要显式指定
iso-2022-kr
作为MIME数据的字符集,则只需手动去除前缀。