Winapi IMultiLanguage2::ConvertStringFromUnicode-如何避免复合前缀?
我正在使用IMultimage2::ConvertStringFromUnicode从UTF-16进行转换。对于某些语言(日语、汉语、韩语),我得到了一个转义序列(例如代码页50225(ISO-2022韩语)的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消息,因此编码在头本身中指定,转义前缀按原样显示 有没有不带前缀的转换方法 谢谢大家! 我觉得这里没有什么问题。这是以下文件中的有效字节序列: 用于指定字符集的转义序列的形
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数据的字符集,则只需手动去除前缀。