[问题] gcc对非英文data c-string采什么编码方式?

楼主: frankhsu421 (问号)   2015-02-15 10:50:36
开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
VC++(2013, x86 amd64), GCC(Cygwin64)
问题(Question):
想了解编译器对非英文的c-string是如何编码,所以写了下列code,
方法是将两个中文字"电脑"写入程式码,以char wchar_t两种方式存入
执行时让资料以hex值output,观察编码情形
我的问题是:
g++以char储存所编出来的码,我找不到它是什么编码方式,
一个中文字占了3个char,这是什么? UTF-24?????
结果(Wrong Output):
char wchar_t
msvc2013 x86及amd64 b9 71 b8 a3 96fb 8166
(Big5 "电"0xb971 (Unicode "电"0x96fb
"脑"0xb8a3) "脑"0x8166)
gcc on cygwin64 e9 9b bb e8 85 a6 96fb 8166
(?????) (Unicode)
程式码(Code):(请善用置底文网页, 记得排版)
#include <iostream>
#include <sstream>
#include <string>
#include <cstring>
#include <cwchar>
#include <cstdint>//-std=c++11
using namespace std;
int main()
{
const char *c="电脑";
const wchar_t *wcl=L"电脑";
string buffer;
ostringstream oss;
cout<<"
作者: LiloHuang (十年一刻)   2015-02-15 11:05:00
e9 9b bb e8 85 a6 那是 UTF-8 编码
楼主: frankhsu421 (问号)   2015-02-15 11:11:00
为何utf-8编中文要用到3个byte,2个不就够了?
作者: LiloHuang (十年一刻)   2015-02-15 11:12:00
请详阅 http://zh.wikipedia.org/wiki/UTF-8UTF-8 采用可变长度的编码,多数字符都是 3 个byte如果编中文两个就够了,那请问日文跟韩文要用几个 byte从另一个角度想就很清楚,到底要几个 byte 才摆的下
楼主: frankhsu421 (问号)   2015-02-15 11:31:00
了解了,有太多语言要放
作者: carylorrk (carylorrk)   2015-02-15 15:34:00
要看你储存文件的编码吧?
楼主: frankhsu421 (问号)   2015-02-15 16:24:00
不对吧 source code的编码只影响编译器要如何读档我上面实验扔给msvc的已经是utf-8档 还是编出big5阿可以传参数给编译器指定string literal要用什么编码上面那些是默认情形下的编码方式
作者: carylorrk (carylorrk)   2015-02-15 17:29:00
sorry, my fault。刚在外面随手回错了XD以 GCC 来说,会用 iconv 转成 -fexec-charset 指定的看存盘编码的是 -finput-charset
楼主: frankhsu421 (问号)   2015-02-15 18:25:00
utf-8会采3 bytes的原因会错意了 应该说是为了能够直接相容于ASCII 让一些比较短的bit pattern被废弃不能用
作者: LiloHuang (十年一刻)   2015-02-15 18:40:00
这是其中一个原因,但是 2 byte 无法塞下全部也是事实常见的 gb2312 cp950 设计上也都是相容于 ASCII 编码Unicode 规划时至少收纳了十万个字,但常用却没这么多因此 Windows 对于 wchar_t 使用 UCS-2 只有 2 bytes但在 Linux 或者 Mac 上,sizeof(wchar_t) 是 4 bytes则是属于 UCS-4 的范围。UTF-8 透过变动长度的方式除了基本相容于 ASCII,还要能表示 Unicode 的任何字符
楼主: frankhsu421 (问号)   2015-02-15 20:31:00
谢谢 对unicode有进一步了解了我今天才知道对中文来UTF-16存起来会比UTF-8小
作者: uranusjr (←這人是超級笨蛋)   2015-02-15 20:36:00
UTF-8 也只有保证“目前”可以表示所有 Unicode 字符 XD尤其现在的 UTF-8 规范把上限下修到 4 bytes, 总有一天还是会用完, 到时候再看看他们打算怎么办
作者: PkmX (阿猫)   2015-02-15 20:50:00
UTF-8 4bytes可以表示到U+10FFFF (17 * 2^16 = 1114112)Unicode 7.0也才定义113021个codepoints 要用完应该还很久XD就算17个planes真的用完 UTF8照规律也可以延伸到使用5 bytes
楼主: frankhsu421 (问号)   2015-02-15 21:09:00
顺带一提 这code在真的linux上跑会runtime errorlinux上uintmax_t没有比wchar_t大
作者: LPH66 (-6.2598534e+18f)   2015-02-15 21:17:00
UTF-8 下修的原因是 Unicode 本来就定到 U+10FFFF 而已UTF-8 4byte 其实可以表示到 0x1FFFFF (32*2^16-1=2097151)而 Unicode 只定到那里的原因是 UTF-16 的 surrogate pairssurrogate pairs 的最后一个组合 U+DBFF U+DFFF 表示的就是 U+10FFFF 再上去的话 surrogate pairs 就不够了
作者: uranusjr (←這人是超級笨蛋)   2015-02-15 21:56:00
那是 UTF-16 的上限, Unicode code point 是无极限的

Links booklink

Contact Us: admin [ a t ] ucptt.com