C++ UNICODE and STL
C++ UNICODE and STL
Windows API在UNICODE
上似乎很大,您可以在Visual C++中创建一个新项目,默认情况下它会将其设置为UNICODE
我想成为一名优秀的Windows程序员,我想使用UNICODE
。
问题是C++标准库和STL(如std::string或td::runtime_error)不能很好地与UNICODE
字符串配合使用。我只能将std::string或char*
传递给std::runtime_error,而且我很确定std::string不支持UNICODE
。
所以我的问题是,我应该如何使用std::runtime_error之类的东西?我应该混合使用UNICODE
和普通ANSI
吗?(我认为这是个坏主意…)
在我的整个项目中只使用ANSI
?(宁愿不…)还是什么?
一般情况下,不应该混合使用这两种编码。但是,异常消息只对开发人员感兴趣(例如,在日志文件中),永远不应该向用户显示(但请查看Jim的评论以获得重要警告)。
因此,如果您将UNICODE
用于整个面向用户的界面,并且仍然在幕后使用std::exception
等用于开发人员消息,那么您是安全的。应该永远没有必要在两者之间转换。
此外,在C++中为与UNICODE
无关的字符串定义typedef
也是一个很好的技巧:
typedef std::basic_string<TCHAR> tstring;
…并类似地有条件地定义tcout
、tcin
等:
#ifdef UNICODE
std::wostream& tcout = std::wcout;
std::wostream& tcerr = std::wcerr;
std::wostream& tclog = std::wclog;
std::wistream& tcin = std::wcin;
#else
std::ostream& tcout = std::cout;
std::ostream& tcerr = std::cerr;
std::ostream& tclog = std::clog;
std::istream& tcin = std::cin;
#endif
Josh,
请看一下我的答案:https://softwareengineering.stackexchange.com/questions/102205/should-utf-16-be-considered-harmful
越来越多的工程师认为std::string非常适合Windows上的unicode,是更快地编写可移植和unicode正确程序的正确方法。
看看这篇关于CodeProject的文章(现在已经很老了):升级基于STL的应用程序以使用Unicode。它涵盖了如果你广泛使用STL,你可能会遇到的问题。它应该没有那么糟糕,一般来说,使用宽字符串是值得的。
要使用Windows Unicode API,只需使用宽字符串版本-wstring等。这对exception::what()
没有帮助,但如果确实需要Unicode,则可以使用UTF-8编码。
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 在C应用程序中运行C++(带有STL)函数
- 使用2个键的cpp-stl::优先级队列排序不正确
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 为什么C++逐位AND运算符在不同大小的操作数中表现为这样
- 为什么 Clang 不允许"and"作为函数名称?
- 在STL容器中使用模板类
- 位阵列上的快速AND运算
- 用C++中的CPerson(类)类型的对象初始化STL矢量
- 是否可以在 C++03 中定义'move-and-swap idiom'等效项
- 将stl字符串缩小到小于15个字符的容量
- 在为LINUX创建共享库时,如何避免STL的私有/弱副本
- Android NDK and C++ STL
- STL vector: resize() and assign()
- C++ STL and DLLs
- pimpl STL and DLL
- C++ UNICODE and STL
- boost::scoped_ptr and STL in C++
- boost::move and stl algorithms