我无法理解之间的差异std::string和std::wstring.我知道wstring支持Unicode字符等宽字符.我有以下问题:
std::wstring用完std::string?std::string保存整个ASCII字符集,包括特殊字符吗?std::wstring由所有流行的C++编译器的支持?我的平台是Mac和C++ 11(或更高版本).我是一名C++初学者,正在处理一个处理中文和英文的个人项目.UTF-8是此项目的首选编码.
我在Stack Overflow上阅读了一些帖子,其中许多人建议std::string在处理UTF-8时使用,并避免wchar_t因为char8_tUTF-8现在没有.
然而,他们没有谈论如何正确地与像函数处理str[i],std::string::size(),std::string::find_first_of()或者std::regex因为这些功能通常面临UTF-8时,返回意外的结果.
我应该继续std::string或切换到std::wstring?如果我应该std::string坚持下去,那么处理上述问题的最佳做法是什么?
我理解它的作用:将字符串文字指定为const wchar_t *(宽字符串)而不是const char *(普通旧字符),但它是如何实际定义的?
它是某种宏吗?它是GCC编译器的运算符吗?这是什么?
我一直在寻找一种在Unicode字符串类型之间进行转换的方法,并且遇到了这种方法.我不仅没有完全理解方法(没有评论),而且文章暗示将来会有更好的方法.
如果这是最好的方法,请指出是什么让它起作用,如果不是,我想听听有关更好方法的建议.
为什么wchar_t需要?它如何优于short(__int16或等等)?
(如果重要:我住在Windows世界.我不知道Linux支持Unicode的做法.)
来自维基百科:
为了在C++编译器中增强对Unicode的支持,char类型的定义已被修改为至少为存储UTF-8的8位编码所需的大小.
我想知道这对于编写便携式应用程序究竟意味着什么.写这个有什么区别吗?
const char[] str = "Test String";
Run Code Online (Sandbox Code Playgroud)
或这个?
const char[] str = u8"Test String";
Run Code Online (Sandbox Code Playgroud)
是否有任何理由不在代码中的每个字符串文字中使用后者?
当TestString中有非ASCII字符时会发生什么?
如果我想在Windows上进行以下工作,那么正确的语言环境是什么?如何检测它实际存在: 此代码是通用的,还是仅仅是我的系统?
我目前正在开发一个业余爱好项目(C/C++),它可以在Windows和Linux上运行,完全支持Unicode.可悲的是,Windows和Linux使用不同的编码使我们的生活更加困难.
在我的代码中,我试图尽可能地使用数据,使Windows和Linux都变得容易.在Windows中,wchar_t默认编码为UTF-16,在Linux中编码为UCS-4(如果我错了,请纠正我).
我的软件打开({_wfopen,UTF-16,Windows},{fopen,UTF-8,Linux})并将数据写入UTF-8文件.到目前为止,这一切都是可行的.直到我决定使用SQLite.
SQLite的C/C++接口允许一个或两个字节的编码字符串(单击).当然,这在Linux中不适用于wchar_t,因为Linux中的wchar_t默认为4个字节.因此,从sqlite编写和读取需要转换为Linux.
目前,代码混乱了Windows/Linux的例外情况.我希望坚持在wchar_t中存储数据的标准思路:
看完之后(这里)我确信我应该坚持使用Windows中的wchar_t.但是在完成所有这些工作之后,麻烦就开始于移植到Linux.
目前我正在考虑重做这一切以坚持使用简单的字符(UTF-8),因为它适用于Windows和Linux,记住我需要'WideCharToMultiByte'在Windows中的每个字符串来实现UTF-8.使用简单的基于char*的字符串将大大减少Linux/Windows的异常数量.
你对跨平台的unicode有经验吗?有关简单地以UTF-8存储数据而不是使用wchar_t的想法的想法?
我正在开发一个库(pugixml),除其他外,它使用窄字符C字符串为XML文档提供文件加载/保存API:
bool load_file(const char* path);
bool save_file(const char* path);
Run Code Online (Sandbox Code Playgroud)
目前路径是逐字传递给的fopen,这意味着在Linux/OSX上你可以传递一个UTF-8字符串来打开文件(或任何其他有效路径的字节序列),但在Windows上你必须使用Windows ANSI编码 - UTF-8不起作用.
文档数据(默认情况下)使用UTF-8表示,因此如果您有一个带有文件路径的XML文档,您将无法将从文档中检索到的路径传递给load_file按原样运行 - 或者更确切地说,这不会在Windows上工作.该库提供了使用的替代函数wchar_t:
bool load_file(const wchar_t* path);
Run Code Online (Sandbox Code Playgroud)
但是使用它们需要额外的努力来将UTF8编码为wchar_t.
一种不同的方法(由SQlite和GDAL使用 - 不确定是否有其他C/C++库这样做)涉及在Windows上将路径视为UTF-8(可通过将其转换为UTF-16并使用a wchar_t-aware函数喜欢_wfopen打开文件).
我可以看到不同的利弊,我不确定哪种权衡是最好的.
一方面,在所有平台上使用一致的编码肯定是好的.这意味着您可以使用从XML文档中提取的文件路径来打开其他XML文档.此外,如果使用该库的应用程序采用UTF-8,则在通过库打开XML文件时不必进行额外的转换.
另一方面,这意味着文件加载的行为不再与标准函数的行为相同 - 因此通过库的文件访问不等同于通过标准fopen/的文件访问std::fstream.似乎虽然有些库采用UTF-8路径,但这在很大程度上是一个不受欢迎的选择(这是真的吗?),因此如果应用程序使用许多第三方库,它可能会增加混乱而不是帮助开发人员.
例如,传递argv[1]到load_file目前适用于使用Windows的系统的locale编码的编码路径(例如,如果你有一个俄罗斯的区域,那么你可以加载与俄罗斯的名字,如任何文件,但你不能用日文字符加载文件).切换到UTF-8意味着只有ASCII路径才能工作,除非您以某种其他Windows特定方式检索命令行参数.
当然,对于图书馆的一些用户来说,这将是一个重大改变.
我在这里错过了什么重点吗?是否有其他图书馆采用相同的方法?什么是更好的C++ - 在文件访问中始终不一致,或争取统一的跨平台行为?
请注意,问题是关于打开文件的默认方式 - 当然没有什么能阻止我用_utf8后缀添加另一对函数或以其他方式指示路径编码.
我目前正在编写一个涉及处理字节的C程序.说到字节,我真的很担心以下问题.
字符是否由ascii代码存储在内存中?说'A'有anscii代码65.所以它以与整数65相同的方式存储在内存中?
如果是这样,机器如何区分字符和整数?
如果字符由ascii代码存储,则ascii代码是整数.一个整数应该占用至少2个字节,一个字符怎么只占用1个字节?
最后一个是关于不同体系结构的整数.在16位机器上,如果1存储为000 ... 0001,那么在32位机器上,1仍然以相同的方式存储,只需在前面添加0?