SetThreadLocale和UTF8

Dan*_*n G 4 c++ atl utf-8

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

我该怎么做呢?SetThreadLocale不会采用像CP_UTF8这样的代码页参数,只是一个LCID.我应该为SetThreadLocale提供什么参数才能实现这个目的?

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

era*_*ran 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类并修复第二个参数).