在我的应用程序中,由于使用不同的API(boost、win32、ffmpeg等),我必须不断地在
由于UTF8向后兼容ASCII,因此我认为我可以始终将所有字符串一致地存储为UTF-8
这种方法效果还不错,我实现了utf8的to_lower、to_upper、iequals。但是,我遇到了几个死胡同,如std::regex和普通字符串比较。要使其可用,我需要基于std::string实现自定义的
基本上,我的结论是utf8不太适合一般用途。而当前的
然而,我的问题是为什么默认的
我看过ICU,但它与假定basic_string的API不太兼容,例如没有begin/end/c_str等函数。
std::string
和std::wstring
之间转换字符串。特别是对于ffmpeg,字符串最终会变成utf8->utf16->utf8->utf16,仅仅是为了打开一个文件。由于UTF8向后兼容ASCII,因此我认为我可以始终将所有字符串一致地存储为UTF-8
std::string
,只有在调用某些不寻常的函数时才转换为std::wstring
。这种方法效果还不错,我实现了utf8的to_lower、to_upper、iequals。但是,我遇到了几个死胡同,如std::regex和普通字符串比较。要使其可用,我需要基于std::string实现自定义的
ustring
类,并重新实现所有相应的算法(包括正则表达式)。基本上,我的结论是utf8不太适合一般用途。而当前的
std::string/std::wstring
也很混乱。然而,我的问题是为什么默认的
std::string
和""
没有简单地改为使用UTF8?特别是UTF8向后兼容?可能有一些编译器标志可以做到这一点吗?当然,STL实现需要自动适应。我看过ICU,但它与假定basic_string的API不太兼容,例如没有begin/end/c_str等函数。
to_lower
是上下文相关的... - Matthieu M.std :: string
和""
可以并且经常是UTF-8。也许提问者想要语言来指定它,并且真正想知道为什么没有这样做。 - bames53""
字符串字面值的值由执行字符集确定,而u8""
字面值的值由UTF-8确定。这些是两个不同、不相交、不相关的问题领域。 - Kerrek SB