SetThreadLocale和UTF8

时间:2009-06-29 17:45:50

标签: c++ utf-8 atl

所以我想使用SetThreadLocale将线程代码页设置为UTF8。到目前为止,我一直在使用atl字符串转换宏的第二个参数,如“CT2A(szBUF,CP_UTF8)”来执行此操作。但我希望能够在SetThreadLocale()的开头设置一次线程代码页,并且不必再次使用转换宏的第二个参数。

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

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

1 个答案:

答案 0 :(得分: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类并修复第二个参数)。