相关疑难解决方法(0)

10
推荐指数
2
解决办法
4092
查看次数

Unicode std :: string类替换

我正在寻找有关unicode感知std :: string库替换的建议.我有一堆使用std :: string,它的迭代器等的代码,并且现在想支持unicode字符串(首选免费或开源实现,正则表达式功能会很棒!).

我现在还不确定是否需要完全重写,或者我是否可以放弃支持所有std :: string接口的新字符串库.unicode世界似乎非常复杂,我只是想在我的应用程序中启用它而不必学习它的每一个方面.

顺便说一下,如果索引运算符必须将引用传递回1,2,3或4结构,理论上可以转换为1,2,3或4字节结构,它如何工作.如果传递更大或更小的值,内部数据表示的来回移位是否会发生?

c++ string unicode locale

10
推荐指数
3
解决办法
5135
查看次数

如何让STL std :: string在Windows上使用unicode?

在我的公司,我们有一个跨平台(Linux和Windows)库,它包含我们自己的STL std :: string扩展,这个类在字符串之上提供所有类型的功能; 最近我们被要求使这个字符串unicode"友好"基本上它需要支持中文,日文,阿拉伯文等字符.经过初步研究,这在Linux方面似乎很好因为每件事本身就是UTF-8,但是我在Windows方面遇到了麻烦; 是否有一个技巧让STL std :: string在Windows上作为UTF-8工作?它甚至可能吗?有没有更好的办法?理想情况下,我们会基于std :: string保留自己,因为这是Linux中基于字符串类的内容.

谢谢,

c++ windows string unicode stl

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

C++中的Unicode和std :: string

如果我用C++写一个随机字符串来包含一些unicode字符,我的文本编辑器告诉我,我没有创建一个有效的UTF-8文件.

// Code example
const std::string charset = "abcdefgàèíü?À";
file << random_string(charset); // using std::fstream
Run Code Online (Sandbox Code Playgroud)

我该怎么做才能解决这个问题?我是否需要进行大量额外的手动编码?我理解它的方式,std :: string不关心编码,只关心字节,所以当我传递一个unicode字符串并将其写入文件时,肯定该文件应包含相同的字节并被识别为UTF- 8编码文件?

c++ string unicode file

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

std :: string,wstring,u16/32string澄清

我的电流之间的差异的理解std::stringstd::wstring仅仅是该缓冲区的类型; 即,charVS wchar_t,分别.

我还读到大多数(如果不是全部)Linux发行版char用于任何和所有字符串,包括ASCII和UTF,其中Windows是主要的操作系统,它已经使用wchar_t了.

但是,还有一些我希望在脑中直接得到的字符串类型:u16string并且u32string,它们分别是具有2字节和4字节缓冲区的字符串.

所以,我的问题是:

在与平台sizeof(wchar_t) == 2,是std::wstring功能上等同于std::u16string,以及与平台sizeof(wchar_t) == 4std::u32string

c++ string unicode std

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

存在哪些C++字符串类/系统具有良好的unicode支持和良好的接口?

在C++开发中使用字符串总是比Java或脚本语言等语言更复杂.我认为一些复杂性来自于C++中的性能焦点,有些只是历史性的.

我知道以下主要的字符串系统,并想知道是否有其他字符串以及它们相互之间有什么特别的缺点:

我承认没有明确的答案,但我认为SOs投票系统非常适合显示实际使用某个字符串系统的人的偏好(以及论证的有效性).


从答案中添加:

  • UFT8-CPP:http://utfcpp.sourceforge.net/

c++

8
推荐指数
1
解决办法
1078
查看次数

C++使用自定义区域设置的小写字符串

我一直试图std::tolower()用不同的语言环境调用,但似乎出现了问题.我的代码如下:

int main() {
    std::locale::global(std::locale("es_ES.UTF-8"));
    std::thread(&function, this); // Repeated some times
    // wait for threads
}

void function() {
    std::string word = "HeÉllO";
    std::transform(word.begin(), word.end(), word.begin(), cToLower);
}

int cToLower(int c) {
    return std::tolower(c, std::locale());
}
Run Code Online (Sandbox Code Playgroud)

所以当我尝试执行这个程序时,我得到:

terminate called after throwing an instance of 'std::bad_cast'
terminate called recursively
  what():  std::bad_cast
Aborted (core dumped)
Run Code Online (Sandbox Code Playgroud)

虽然执行return std::tolower(c);工作正常,但它只是将'标准'字符转换为较低的,而不是É.

我有一些线程同时执行相同的功能,使用C++ 11并使用g ++进行编译(如果它与它有关).

我想知道这是否是实现我想做的正确方法,或者还有其他一些方法.

谢谢!

c++ locale tolower

8
推荐指数
1
解决办法
988
查看次数

冲突:C++标准和Windows实现中wchar_t字符串的定义?

来自c ++ 2003 2.13

宽字符串文字具有类型" n const wchar_t的数组 "并具有静态存储持续时间,其中n是字符串的大小,如下所定义

宽字符串文字的大小是转义序列,通用字符名称和其他字符的总数,加上一个用于终止L'\ 0'.

来自c ++ 0x 2.14.5

宽字符串文字的类型为" n const wchar_t的数组 ",其中n是字符串的大小,如下所示

char32_t或宽字符串文字的大小是转义序列,通用字符名称和其他字符的总数,加上一个用于终止U'\ 0'或L'\ 0'.

char16_t字符串文字的大小是转义序列,通用字符名称和其他字符的总数,加上需要代理项对的每个字符一个,加上一个用于终止u'\ 0'.

C++ 2003中的陈述非常模糊.但是在C++ 0x中,当计算字符串的长度时,宽字符串文字wchar_t应被视为与char32_t相同,并且与char16_t不同.

有一篇文章明确说明了windows如何在/sf/ask/28159841/?tab=votes%23tab-top中实现wchar_t

简而言之,Windows中的wchar_t是16位并使用UTF-16编码.标准中的陈述显然在Windows中留下了一些冲突.

例如,

wchar_t kk[] = L"\U000E0005";
Run Code Online (Sandbox Code Playgroud)

这超过16位,对于UTF-16,它需要两个16位来编码它(代理对).

但是,从标准来看,kk是2个wchar_t的数组(1表示通用名称\ U000E005,1表示\ 0).

但是在内部存储中,Windows需要3个16位wchar_t对象来存储它,2个wchar_t用于代理对,1个wchar_t用于\ 0.因此,从数组的定义来看,kk是一个3 wchar_t的数组.

这显然是相互冲突的.

我认为Windows的一个最简单的解决方案是"禁止"在wchar_t中需要代理对的任何东西("禁止"在BMP之外的任何unicode).

我的理解有什么不对吗?

谢谢.

c++ unicode wchar-t string-literals c++11

7
推荐指数
1
解决办法
4965
查看次数

C++字符串,何时使用?

现在已经有一段时间了,我一直用C++进行编码,而且我认为大多数实际用C++编写代码的人会同意最棘手的决定之一就是选择几乎令人眼花缭乱的字符串类型.我主要更喜欢ATL Cstring的易用性和功能,但是想要对可用选项进行比较研究.我已经检查了SO并且没有找到任何帮助选择正确字符串的内容.有些网站会说明从一个字符串到另一个字符串的转换,但这不是我们想要的.

希望根据专业,性能,可移植性(Windows,Mac,Linux/Unix等),易用性/功能,多语言支持(Unicode/MBCS),缺点(如果有的话)以及任何其他特殊功能进行比较案例.

我列出了我到目前为止遇到的字符串.我相信会有更多,所以我们可以稍后编辑它以适应其他选项.请注意,我主要在Windows上工作,所以列表反映了相同:

  1. char*
  2. std::string
  3. STL的 basic_string
  4. ATL的 CString
  5. MFC的 CString
  6. BSTR
  7. _bstr_t
  8. CComBstr

c++ string visual-studio visual-c++

6
推荐指数
1
解决办法
414
查看次数

为什么c ++库经常定义自己的原始类型?

我最近开始使用OpenCL库,我注意到他们正在使用自己的整数类型,比如cl_int和cl_uint,而不是int和unsigned int.

这是为什么?为什么他们不使用语言中默认的类型?这是一个好的做法还是有实际的原因(即更易读的代码)?

c++ types naming-conventions

6
推荐指数
1
解决办法
814
查看次数