2009-06-29 90 views
3

所以我想使用SetThreadLocale将线程代码页设置为UTF8。到目前为止,我一直在使用atl字符串转换宏的第二个参数,如“CT2A(szBUF,CP_UTF8)”来做到这一点。但我希望能够使用SetThreadLocale()一次性地设置线程代码页,而不必再次使用转换宏的第二个参数。SetThreadLocale和UTF8

我该怎么做? SetThreadLocale不会像CP_UTF8那样采用代码页参数,只是一个LCID。我应该给SetThreadLocale提供什么参数来实现这个?

请记住,我没有考虑到特定的语言。我得到的字符串可能是日文,韩文,英文等等。到目前为止,在将CP_UTF8指定为转换宏的第二个参数时,我对这种字符串组合没有任何问题。你可能会问“为什么不继续使用第二个参数”。答案“,因为它可以很容易被代码工作的团队成员遗忘,如果它能够正确使用转换宏的默认1参数版本,那将是非常好的。”

回答

5

SetThreadLocale需要一个语言标识符,但UTF-8不是一种语言标识符 - 它是一种Unicode编码。土地ID的目的之一是告诉系统如何处理128-255范围内的ANSI文本。给定一个真正的语言,它的代码页将用于处理这些字符。 UTF-8,OTOH是Unicode文本的压缩表示。为了创建UTF-8文本,您的输入必须是Unicode。鉴于ANSI文本,你只是不知道如何转换字符的上限。这是完成“手动”操作的方式,为了将ANSI转换为UTF-8,您必须首先使用带指定代码页的MultiByteToWideChar,然后才能将生成的Unicode字符串转换为UTF-8。

现在,回到你的问题 - 我会以另一种方式。如果额外的代码页参数错误的话,请制作一个隐藏它的宏(或继承CT2A类,并修复第二个参数)。

+0

这个解释很有道理,谢谢。是的,我想我只是要使用第二个参数。似乎并不是为线程设置代码页的简单方法。 – 2009-06-30 14:31:21