相关疑难解决方法(0)

如何在C++中打印Unicode字符?

我正在尝试打印俄语"ф"(U + 0444 CYRILLIC SMALL LETTER EF)字符,其代码为十进制1092.使用C++,我该如何打印出这个角色?我会想到下面的内容会起作用,但......

int main (){
   wchar_t f = '1060';
   cout << f << endl;
}
Run Code Online (Sandbox Code Playgroud)

c++ unicode iostream cout wchar-t

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

Unicode地狱(在Windows上)

今天我醒来后觉得我的代码和我用过的每个图书馆都出现了严重问题,我认为我是对的......(或者请指出我的推理错误的地方)

让我们回到过去十年或者两年,一切都在世界上很好.我跟我的邻居说话,他讲的是同一种语言:只是简单的英语.对我来说,我的邻居和Windows似乎很明显将我们的字符串存储在8位chars中,因为我们使用的所有字符都可以存储在2 ^ 8 = 256种可用组合中.

然后奇迹般的互联网出现了,并允许我与欧洲的一些朋友(他们没有时间学习英语)交谈.这很难用我们的char格式,使用的字符数量很容易超过256,所以在我们完全简单的视觉中我们决定使用16位wchar_ts.称为UCS-2 unicode的东西.它有2 ^ 16 = 65.536种可用组合,对于世界上的每种语言都必须足够!相信我们的正确性,我们甚至还添加了16位的Windows API的W功能,如MessageBoxWCreateWindowW.我们说服了每个程序员我们的宗教,并且不鼓励使用邪恶的8位对应物(MessageBoxACreateWindowA)并通过在我们的构建中定义来MessageBox自动映射调用.因此我们也应该使用函数而不是旧函数(例如,现在应该使用,或者使用自动映射).MessageBoxW_UNICODEwcsstrstrlenwcslen_tcslen

然后事情变得糟糕,事实证明世界上还有其他人使用甚至比我们更怪异的字形(没有冒犯):日本人,中国人等等.它变坏了,因为例如中国人有超过70,000个不同的字符.发生了很多咒骂,给我们留下了一种新型的unicode:UTF-16.它还使用16位数据类型,但某些字符需要两个16位值(称为代理对).这意味着我们不能在这些16位字符串上使用索引(例如,theString [4]可能不会返回第5个字符).为了修补Windows API,决定所有W函数现在应该支持UTF-16格式,这是一个简单的决定,因为所有旧的UCS-2字符串也是有效的UTF-16字符串.但是,因为我们是勇敢的程序员,所以我们现在使用这些wcs功能.遗憾的是,这些功能不具有代理意识,仍然符合UCS-2格式......

与此同时,在一个黑暗的阁楼里,开发了另一种更紧凑的unicode形式:UTF-8.使用8位数据类型,大多数西方语言可以存储在一个8位值中,就像过去一样.当存储更奇特的字形时,使用多个8位值,对于大多数欧洲语言2就足够了.但是,它可能会扩展其中4个值,实质上是创建32位存储类型.就像它的胖兄弟UTF-16一样,我们不能在这些字符串上使用索引.由于它更紧凑的格式,UTF-8现在在互联网上的各个地方广泛使用,因为它节省了带宽.

很好,你是通过我冗长的写作来实现的:)现在我有一些问题/兴趣点:

  1. 好的,我对使用UTF-8进行存储非常满意.当我读取一个文件(来自磁盘或HTTP响应)时,我检测到UTF-8签名"\xEF\xBB\xBF"并将内容放在MultiByteToWideChar我的UTF-16字符串中.我可以使用WAPI函数,没问题.但是现在我想修改字符串,替换一些字符等.好的旧wcs函数不再好了,哪些核心字符串函数是UTF-16识别的?还是有一些出色的图书馆,我不知道吗?编辑:似乎ICU是一个非常好的解决方案.我还发现这些wcs函数并不是完全无用的,你可以用来wcsstr搜索,它基本上只是比较wchar_ts.唯一的问题是字符串的长度.

  2. 当我们被迫使用16位缺陷W函数时,你是否感觉到了一个丑陋的错误.难道问题不应该在更早的阶段得到认可,并且让所有原始API函数都采用UTF-8字符串并包含适当的字符串操作例程吗?或者这已经是可能的,我可怕的错了吗?编辑:也许这是一个愚蠢的问题,后见之明确实很精彩,现在没有人放下任何人;)

  3. 为了快速索引字符,我们应该以32位值存储字符串.这是常见的吗?(我可以听到你的想法:然后我们遇到了一种需要更多组合的外星语言,并且乐趣又重新开始...)这种方法的缺点似乎是我们应该每次将字符串转换回UTF-16我们进行Windows API调用.编辑:引用Alf P. Steinbach 每个指数一个角色是一个绝望的梦想,我现在看到了.我完全错过的一件事是变音符号.我也认为在OS的本机编码中处理是一件好事(对于Windows …

c++ winapi ucs2 utf-8 utf-16

29
推荐指数
4
解决办法
1892
查看次数

在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万
查看次数

`<cuchar>`提供什么,它在哪里记录?

新的C++ 11标准提到了一个标题<cuchar>,可能与C99类似<uchar.h>.

现在,我们知道C++ 11带来了专门为UTF16和UTF32设计的新字符类型和文字,但我不认为该语言实际上会包含将(系统相关的)窄多字节编码转换为其中一个的函数. Unicode编码.但是,我刚刚遇到了<cuchar>提及函数mbrtoc16/ c16rtombrmbrtoc32/ 的头文件概要c32rtombr.

不幸的是,标准没有提到标题概要之外的那些功能.这些功能在哪里定义,他们真正做了什么,在哪里可以阅读更多关于它们的内容?这是否意味着现在可以使用标准C++完全使用适当的Unicode,而无需任何额外的库?

c++ unicode c++11

16
推荐指数
1
解决办法
1571
查看次数

Unicode字符串文字

C++ 11引入了一组新的字符串文字前缀(甚至允许用户定义的后缀).除此之外,您可以直接使用Unicode转义序列来编码某个符号,而无需担心编码.

const char16_t* s16 = u"\u00DA";
const char32_t* s32 = U"\u00DA";
Run Code Online (Sandbox Code Playgroud)

但是我可以在wchar_t字符串文字中使用unicode转义序列吗?如果不可能,这似乎是一个缺陷.

const wchar_t* sw = L"\u00DA";
Run Code Online (Sandbox Code Playgroud)

will的整数值sw[0]当然取决于wchar_t特定平台上的内容,但对于所有其他效果,这应该是可移植的,不是吗?

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

13
推荐指数
1
解决办法
1万
查看次数

在C++中处理UTF-8

要了解C++是否是我的项目的正确语言,我想测试UTF-8功能.根据参考资料,我建立了这个例子:

#include <string>
#include <iostream>

using namespace std;

int main() {
    wstring str;
    while(getline(wcin, str)) {
        wcout << str << endl;
        if(str.empty()) break;
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是当我输入一个UTF-8字符时,它行为不端:

$ > ./utf8 
Hello
Hello
für
f
$ >
Run Code Online (Sandbox Code Playgroud)

它不仅不会打印ü,而且会立即退出.gdb告诉我没有崩溃,但正常退出,但我发现很难相信.

c++ linux stl utf-8 wstring

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

是`char16_t`和`char32_t`用词不当?

注意:我确信有人会称之为主观,但我认为这是相当有形的.

C++ 11为我们提供了新的basic_string类型std::u16stringstd::u32string,类型别名std::basic_string<char16_t>std::basic_string<char32_t>分别.

在这种情况下使用子串"u16""u32"我的意思是"UTF-16"和"UTF-32",这很愚蠢,因为C++当然没有文本编码的概念.

其实名字体现人物类型char16_tchar32_t,但这些似乎名不副实.由于其基础类型的无符号性,它们无符号的:

[C++11: 3.9.1/5]:[..]类型char16_tchar32_t表示不同类型与大小相同,符号性,和对准如uint_least16_tuint_least32_t,分别[..]

但是在我看来,这些名称违反了这样的约定,即这种无符号类型的名称开头'u',并且使用像16术语一样不符合数字的数字least表示固定宽度类型.

那么,我的问题是:我想象的是,或者这些名字是否存在根本缺陷?

c++ language-lawyer c++11

12
推荐指数
1
解决办法
4310
查看次数

文件编码如何影响C++ 11字符串文字?

可以通过前缀字符串文字与写在C++ 11 UTF-8/16/32字符串文字u8/ u/ U分别.编译器如何解释这些新类型的字符串文字中包含非ASCII字符的UTF-8文件?我理解标准没有指定文件编码,而这个事实本身就会使源代码中非ASCII字符的解释完全未定义的行为,使得这个特性有点不太有用.

我知道你仍然可以逃脱单个unicode字符\uNNNN,但这对于完整的俄语或法语句子来说并不是很易读,因为它通常包含多个unicode字符.

我从各种来源理解的是,它u应该等同L于当前的Windows实现和ULinux实现.因此,考虑到这一点,我也想知道旧字符串文字修饰符所需的行为是什么......

对于代码示例猴子:

string utf8string a = u8"L'hôtel de ville doit être là-bas. Ça c'est un fait!";
string utf16string b = u"L'hôtel de ville doit être là-bas. Ça c'est un fait!";
string utf32string c = U"L'hôtel de ville doit être là-bas. Ça c'est un fait!";
Run Code Online (Sandbox Code Playgroud)

在理想的世界中,所有这些字符串都产生相同的内容(如:转换后的字符),但我使用C++的经验告诉我,这绝对是实现定义的,并且可能只有第一个才能做我想要的.

c++ encoding string-literals c++11

11
推荐指数
2
解决办法
3414
查看次数

How to use Unicode (UTF-8) in C++

Possible Duplicate:
Unicode in C++

If I remembered correctly, the default character and string encoding in C++ are ASCII. Is there a simple way to enable Unicode support?

c++ unicode

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

字符文字与字符串文字的U前缀有什么区别?

在C++编程语言C++第4版第6.2.6节中,它说:

允许R,L和u前缀的组合,例如,uR"**(foo \(bar))**".请注意字符(无符号)和字符串UTF-32编码(第7.3.2.2节)的U前缀含义的显着差异.

我不太明白作者在这里想说的是什么.确实是什么"戏剧性的差异"?为什么这里使用"(unsigned)"这个词?

根据我的理解,带U前缀的字符文字包含引用字符的ISO-10646代码点值,它基本上与字符串文字的U前缀相同,并且与"unsigned"的概念无关. ".

c++

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