谈到国际化和Unicode,我是一个白痴美国程序员。这是交易。
#include <string>
using namespace std;
typedef basic_string<unsigned char> ustring;
int main()
{
static const ustring my_str = "Hello, UTF-8!"; // <== error here
return 0;
}
这会产生意外的抱怨:
cannot convert from 'const char [14]' to 'std::basic_string<_Elem>'
今天我的咖啡可能错了。我该如何解决?我可以保留基本结构:
ustring something = {insert magic incantation here};
答案 0 :(得分:5)
窄字符串文字定义为const char
,并且没有无符号字符串文字[1],因此您必须强制转换:
ustring s = reinterpret_cast<const unsigned char*>("Hello, UTF-8");
当然你可以把那么长的东西放到内联函数中:
inline const unsigned char *uc_str(const char *s){
return reinterpret_cast<const unsigned char*>(s);
}
ustring s = uc_str("Hello, UTF-8");
或者你可以使用basic_string<char>
并在你处理UTF-8时有99.9%的时间逃脱它。
[1]除非char
是无符号的,但它是否是实现定义的,blah,blah。
答案 1 :(得分:1)
对不同的编码使用不同的字符类型具有以下优点:编译器在您搞砸时会咆哮。缺点是,你必须手动转换。
救援的一些辅助功能:
inline ustring convert(const std::string& sys_enc) {
return ustring( sys_enc.begin(), sys_enc.end() );
}
template< std::size_t N >
inline ustring convert(const char (&array)[N]) {
return ustring( array, array+N );
}
inline ustring convert(const char* pstr) {
return ustring( reinterpret_cast<const ustring::value_type*>(pstr) );
}
当然,当要转换的字符串包含除ASCII之外的任何内容时,所有这些都会无声地和致命地失败。
答案 2 :(得分:0)
让您的生活更轻松,使用UTF-8字符串库,例如http://utfcpp.sourceforge.net/或使用std :: wstring并使用UTF-16。 您可能对另一个关于堆栈溢出的问题的讨论感兴趣:C++ strings: UTF-8 or 16-bit encoding?