相关疑难解决方法(0)

std :: wstring VS std :: string

我无法理解之间的差异std::stringstd::wstring.我知道wstring支持Unicode字符等宽字符.我有以下问题:

  1. 我什么时候应该std::wstring用完std::string
  2. 可以std::string保存整个ASCII字符集,包括特殊字符吗?
  3. std::wstring由所有流行的C++编译器的支持?
  4. 什么是" 广角 "?

c++ string unicode c++-faq wstring

716
推荐指数
7
解决办法
29万
查看次数

如何在C++中正确使用UTF-8上的std :: string?

我的平台是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坚持下去,那么处理上述问题的最佳做法是什么?

c++ string c++11

57
推荐指数
4
解决办法
2万
查看次数

C++中的L前缀究竟是什么?

我理解它的作用:将字符串文字指定为const wchar_t *(宽字符串)而不是const char *(普通旧字符),但它是如何实际定义的?

它是某种宏吗?它是GCC编译器的运算符吗?这什么?

c++ string widestring

45
推荐指数
3
解决办法
3万
查看次数

在string,u16string和u32string之间转换

我一直在寻找一种在Unicode字符串类型之间进行转换的方法,并且遇到了这种方法.我不仅没有完全理解方法(没有评论),而且文章暗示将来会有更好的方法.

如果这是最好的方法,请指出是什么让它起作用,如果不是,我想听听有关更好方法的建议.

c++ string unicode unicode-string c++11

43
推荐指数
2
解决办法
4万
查看次数

wchar_t为什么被发明?

为什么wchar_t需要?它如何优于short(__int16或等等)?

(如果重要:我住在Windows世界.我不知道Linux支持Unicode的做法.)

c c++ windows

23
推荐指数
7
解决办法
7721
查看次数

在C++ 11中是否需要u8字符串文字

来自维基百科:

为了在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字符时会发生什么?

c++ utf-8 literals string-literals c++11

21
推荐指数
4
解决办法
2万
查看次数

什么是Windows等效的en_US.UTF-8语言环境?

如果我想在Windows上进行以下工作,那么正确的语言环境是什么?如何检测它实际存在: 此代码是通用的,还是仅仅是我的系统?

c++ unicode locale utf-8

15
推荐指数
4
解决办法
2万
查看次数

C/C++中的跨平台unicode:使用哪种编码?

我目前正在开发一个业余爱好项目(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:文件路径没有问题,读取/写入sqlite没有问题.无论如何,将数据写入文件应该以UTF-8完成.
  • Linux中的wchar_t:由于UTF-8编码导致的文件路径异常,读取/写入sqlite(wchar_t)之前的转换,以及将数据写入文件时的窗口相同.

看完之后(这里)我确信我应该坚持使用Windows中的wchar_t.但是在完成所有这些工作之后,麻烦就开始于移植到Linux.

目前我正在考虑重做这一切以坚持使用简单的字符(UTF-8),因为它适用于Windows和Linux,记住我需要'WideCharToMultiByte'在Windows中的每个字符串来实现UTF-8.使用简单的基于char*的字符串将大大减少Linux/Windows的异常数量.

你对跨平台的unicode有经验吗?有关简单地以UTF-8存储数据而不是使用wchar_t的想法的想法?

linux windows unicode cross-platform wchar-t

9
推荐指数
1
解决办法
2741
查看次数

C++库中的文件打开界面是否应该在Windows上使用UTF-8?

我正在开发一个库(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++ windows unicode encoding utf-8

9
推荐指数
1
解决办法
1024
查看次数

如何将不同类型存储在内存中

我目前正在编写一个涉及处理字节的C程序.说到字节,我真的很担心以下问题.

  1. 字符是否由ascii代码存储在内存中?说'A'有anscii代码65.所以它以与整数65相同的方式存储在内存中?

  2. 如果是这样,机器如何区分字符和整数?

  3. 如果字符由ascii代码存储,则ascii代码是整数.一个整数应该占用至少2个字节,一个字符怎么只占用1个字节?

  4. 最后一个是关于不同体系结构的整数.在16位机器上,如果1存储为000 ... 0001,那么在32位机器上,1仍然以相同的方式存储,只需在前面添加0?

c memory types

8
推荐指数
2
解决办法
8474
查看次数