字符串文字到basic_string <unsigned char =“”> </unsigned>

时间:2010-09-30 20:32:20

标签: c++ string unicode internationalization

谈到国际化和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};

3 个答案:

答案 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?