支持和反对在跨平台库中专门支持std::wstring的论点 我目前正在开发一个跨平台的C++库,我希望它是Unicode的。我目前通过typedef和宏对std::string或std::wstring提供编译时支持。这种方法的缺点是,它迫使您使用诸如L(“string”)之类的宏,并大量使用基于字符类型的模板

支持和反对在跨平台库中专门支持std::wstring的论点 我目前正在开发一个跨平台的C++库,我希望它是Unicode的。我目前通过typedef和宏对std::string或std::wstring提供编译时支持。这种方法的缺点是,它迫使您使用诸如L(“string”)之类的宏,并大量使用基于字符类型的模板,c++,unicode,cross-platform,wstring,C++,Unicode,Cross Platform,Wstring,支持和反对只支持std::wstring的论点有哪些 使用std::wstring是否会妨碍GNU/Linux用户群,而UTF-8编码是首选 支持和反对只支持std::wstring的论点有哪些 赞成使用宽字符的理由是,它可以做窄字符所能做的一切,甚至更多 据我所知,反对它的理由是: 宽字符需要更多的空间(这几乎不相关,原则上,中国人不会比美国人更头疼记忆问题) 使用宽字符给一些西方人带来了麻烦,他们习惯于将所有字符都放在7bit中(并且不愿意学习注意不要将字符类型的实际使用与其他使用混为一谈

支持和反对只支持std::wstring的论点有哪些

使用std::wstring是否会妨碍GNU/Linux用户群,而UTF-8编码是首选

支持和反对只支持std::wstring的论点有哪些

赞成使用宽字符的理由是,它可以做窄字符所能做的一切,甚至更多

据我所知,反对它的理由是:

  • 宽字符需要更多的空间(这几乎不相关,原则上,中国人不会比美国人更头疼记忆问题)
  • 使用宽字符给一些西方人带来了麻烦,他们习惯于将所有字符都放在7bit中(并且不愿意学习注意不要将字符类型的实际使用与其他使用混为一谈)
至于灵活性:我维护了一个库(几个kLoC),可以处理窄字符和宽字符。大部分是通过字符类型作为模板参数实现的,我不记得有任何宏(除了
UNICODE
)。不过,并非所有这些都是灵活的,其中有一些代码最终需要
char
wchar\t
字符串。(使用宽字符使内部键字符串变宽没有意义。)
用户可以决定是只需要窄字符支持(在这种情况下,
“string”
就可以了),还是只需要宽字符支持(这要求他们使用
L“string”
),或者他们也想同时支持这两种支持(这需要类似于
T(“string”)

对于:

  • 乔尔·斯波尔斯基写道。如果你滚动到底部,你会发现他的团队只使用宽字符串。如果对他们足够好,对你也足够好
反对:

  • 您可能必须使用不支持i18n的代码进行接口。但就像任何优秀的图书馆作家一样,你只需要把这些乱七八糟的东西隐藏在一个易于使用的界面后面,对吗?对吧?

很多人都希望将unicode与UTF-8(std::string)而不是UCS-2(std::wstring)结合使用。UTF-8是许多linux发行版和数据库上的标准编码,因此不支持UTF-8将是一个巨大的缺点。在Linux上,对库中以字符串作为参数的函数的每次调用都需要用户将(本机)UTF-8字符串转换为std::wstring

在gcc/linux上,std::wstring的每个字符将有4个字节,而在Windows上则有2个字节。在读取或写入文件(以及从/向不同平台复制文件)时,这可能会导致奇怪的效果。对于跨平台项目,我宁愿推荐UTF-8/std::string。

缺点:


因为wstring是真正的UCS-2,而不是UTF-16。总有一天我会踢你的小腿。我想说,使用
std::string
std::wstring
是不相关的

无论如何,都没有提供适当的Unicode支持

如果您需要国际化,那么您需要适当的Unicode支持,并且应该开始研究诸如ICU之类的库

之后,问题是使用哪种编码,这取决于您所处的平台:将依赖操作系统的设施包装在抽象层之后,并在适用时在实现层进行转换


不要担心您使用的Unicode库(或build?哼哼)内部使用的编码,这是一个性能问题,不应该影响库本身的使用。

这一点很好。另外,在std::string和std::wstring混合的环境中,GCC似乎表现不好。@Oskar N.什么样的问题?我在使用gcc时从来没有遇到过任何问题。例如,使用gcc(4字节)和visual studio(2字节)时,wchar\u t的大小不同,那么Microsoft Windows上的UTF-8/std::string呢?Windows在内部使用UTF-16。是唯一可行的选择来支持这两种方法,还是只在UTF-8/STD::即使在Windows上也可以是真正的跨平台?我认为将UTF-8存储在<代码> STD::String 中是一个坏主意,因为我已经学会了困难的方式,这是有问题的。如果这样做,则无法通过查看字符串的类型来判断它是包含系统编码字符还是UTF-8编码字符。(即使在Unicode应用程序中,您仍然需要大量ASCII字符串。)在一个相当大的应用程序中,我看到了大量错误,因为GUI中显示了UTF-8字符串。这只是在UTF-8使用了一个特殊的
std::basic_string
实例之后才改变的,因此编译器将直接赋值标记为错误。这似乎是一篇很棒的文章。我以后再看。它提到了在GNU/Linux平台上使用std::wstring吗?不幸的是,Joel主要是一个Windows操作系统的人,因此他的观点是。。。目光短浅的当涉及到跨平台时。在页面上快速搜索“linux”和“unix”只提到一点:在历史部分。我非常喜欢Python 3的方法-新的
str
类是unicode,还有一个新的
bytes
类来保存字节序列,并提供类似字符串的操作(子字符串搜索等)。但它们只能通过编码转换为文本。因此,如果有人计划“只包含7位值的数据”,他们可以使用“字节”来节省内存,但他们的对象与适当的字符串不兼容。我在C++中看到的这个棘手的问题是山姆