[問題] 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