作者donkeychen (Bad_To_The_Bone)
看板Programming
標題[問題] 關於中文編碼問題 想請教有無資料可查閱
時間Wed Dec 11 14:54:46 2013
大家好
想請教一下關於中文編碼的問題
以 "複製" 兩個字來看
我利用google搜尋的網址 測試
用
%BD%C6%BB%73
可以得到與
%E8%A4%87%E8%A3%BD
一樣的結果
(
https://www.google.com.tw/search?
safe=off&rlz=1C1SAVA_enTW501TW501&espv=210&es_sm=93&q=
%BD%C6%BB%73
)不縮網址
(
https://www.google.com.tw/search?
safe=off&rlz=1C1SAVA_enTW501TW501&espv=210&es_sm=93&q=
%E8%A4%87%E8%A3%BD
) 不縮網址
==========================================================
我看了一下一個文字檔如果我用winxp 用pspad輸入
"複製"
在hex editor裡面看到的是
BDC6BB73
我嘗試以Hex editor把BDC6BB73 的部分以 E8A487E8A3BD 取代
而填入後直接打開顯示為亂碼
"銴殴ˊ"
===========================================================
另外如果在GOOGLE搜尋欄位搜尋
"%E8%A4%87%E8%A3%BD"
一樣能找到一些與 "複製" 相關的網頁
複製狗狗技術進軍英國- Yahoo奇摩新聞
真的有辦法複製人腦嗎?IBM的複製人工智慧計畫大公開
===========================================================
由於去Browser版看好像大多都是在討論亂碼的問題
回答多屬於修改瀏覽器的設定
想請問一下在這邊的大大有沒有對這方面有涉獵的
是否有工具/網頁 OR 以程式讀BYTE做修改的方式做轉換
(寫程式應該不困難 但是不懂轉換原則)
謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 210.59.147.226
1F:→ azureblaze:前面是BIG5後面是UTF-8 1.34.63.98 12/11 14:57
2F:→ azureblaze:轉換用ConvertZ 1.34.63.98 12/11 14:57
※ 編輯: donkeychen 來自: 210.59.147.226 (12/11 14:59)
3F:→ donkeychen:感謝azureblaze大大 我剛剛試了一下 210.59.147.226 12/11 15:05
4F:→ donkeychen:一個binary檔案 裡面內容只有 210.59.147.226 12/11 15:05
5F:→ donkeychen:E8A487E8A3BD 跟一個binary 裡面 210.59.147.226 12/11 15:06
6F:→ donkeychen:內容只有 BDC6BB73 都存成.txt檔 210.59.147.226 12/11 15:06
7F:→ donkeychen:用notepad下都可打開 都會顯示正常的 210.59.147.226 12/11 15:07
8F:→ donkeychen:複製 想請問一下是編輯器自己偵測的嗎 210.59.147.226 12/11 15:08
9F:推 LPH66:是的, 不過不太準確; 可參見本版 #17GlyKP2 210.69.49.38 12/11 15:38
10F:→ LPH66:不過理論上如果真是 UTF-8 那應該不會認錯 210.69.49.38 12/11 15:39
11F:→ MOONRAKER:你pspad就有編碼設定了 全部copy=>改編 118.163.12.174 12/11 15:39
12F:→ LPH66:另外打開後你也可以另存看對話框的選項 210.69.49.38 12/11 15:39
13F:→ MOONRAKER:碼=>存回去 就可觀察檔案內編碼不同 118.163.12.174 12/11 15:39
16F:推 purpose:你到底想幹嘛?簡單的編碼轉換可以用任意 124.8.134.106 12/11 16:43
17F:→ purpose:可切換編碼的hex editor,把想轉的複製到 124.8.134.106 12/11 16:44
18F:→ purpose:剪貼簿,再選擇新的編碼->貼上,就轉換了 124.8.134.106 12/11 16:44
大大
我有一份工作上需要用到的log檔案
整份log的中文部分呈現亂碼
但是我明確的知道這個呈現亂碼的地方該是中文的"複製"
我不想直接在板上講明自己在做什麼(鬼)工作
所以把我覺得可能有問題的部分po到板上
但是如果大大真的不嫌棄
那可以到
https://dl.dropboxusercontent.com/u/57491997/CoreLog.log
下載
搜尋1111(文字)即可找到有問題的地方
這份檔案我嘗試過MOONRAKER大大的做法
會從原本的 E8A487E8A3BD
變成 E98AB4EF8BACCB8A
他把我原本呈現錯誤的字(亂碼)以utf-8的方式存起來了...
※ 編輯: donkeychen 來自: 210.59.147.226 (12/11 17:40)
19F:→ donkeychen:目前此檔案拉到chrome可以顯示為中文 210.59.147.226 12/11 17:45
20F:→ donkeychen:但是如果直接點上面的dropbox的連結 210.59.147.226 12/11 17:46
21F:→ donkeychen:以chrome開啟 還是會有亂碼 210.59.147.226 12/11 17:46
22F:→ azureblaze:那是因為dropbox告訴chrome編碼是英文 1.34.63.98 12/11 17:52
23F:→ azureblaze:沒人說(直接開)chrome會想辦法自己偵測 1.34.63.98 12/11 17:53
24F:→ donkeychen:喔喔 了解 那這樣應該chrome選utf-8是 210.59.147.226 12/11 17:55
25F:→ donkeychen:對的 我猜是PSPAD跟LPH66大大說的一樣 210.59.147.226 12/11 17:56
26F:→ donkeychen:誤判為別國語系 210.59.147.226 12/11 17:56
27F:→ MOONRAKER:這…你當然要正確的中文字去轉阿 118.163.12.174 12/11 17:57
28F:→ MOONRAKER:不知道編碼就是強開看對不對 不是轉碼 118.163.12.174 12/11 17:58
29F:→ MOONRAKER:不然硬轉當然就轉爛了 118.163.12.174 12/11 17:58
30F:→ donkeychen:大大 我的意思是我的pspad一開始就以 210.59.147.226 12/11 18:52
31F:→ donkeychen:ANSI的方式打開 如果我選utf-8 關掉 210.59.147.226 12/11 18:53
32F:→ donkeychen:檔案的時候不存 他下次打開同個檔案 就 210.59.147.226 12/11 18:53
33F:→ donkeychen:以utf-8 開啟 就會正確顯示 210.59.147.226 12/11 18:53
34F:→ donkeychen:然而 再選ANSI後 關閉檔案(不存) 210.59.147.226 12/11 18:54
35F:→ donkeychen:下次開啟又以ansi開啟 210.59.147.226 12/11 18:54
36F:→ donkeychen:pspad看起來選擇改變編碼 另存 反而是 210.59.147.226 12/11 18:55
37F:→ donkeychen:把當下顯示錯誤的東西以新的編碼方式 210.59.147.226 12/11 18:55
38F:→ donkeychen:做儲存 210.59.147.226 12/11 18:55
39F:→ donkeychen:看起來純粹是編輯器編碼設定上的問題 210.59.147.226 12/11 18:56
40F:→ donkeychen:以正確的格式打開就不需要做編碼的轉換 210.59.147.226 12/11 18:57
41F:→ donkeychen:只是PSPAD目前看起來 單純的UTF-8 210.59.147.226 12/11 18:57
42F:→ donkeychen:或者是BIG5的檔案都正確的用對應的編碼 210.59.147.226 12/11 18:58
43F:→ donkeychen:開啟 (我的第一段推文中我是用BINARY方 210.59.147.226 12/11 18:58
44F:→ donkeychen:式寫檔 讓PSPAD開啟 都會顯示正確) 210.59.147.226 12/11 18:59
45F:→ donkeychen:而這檔案開啟時有可能誤判了模式 210.59.147.226 12/11 19:00
46F:→ donkeychen:而pspad改變編碼模式又不是browser的方 210.59.147.226 12/11 19:00
47F:→ donkeychen:式 改成UTF-8 就把原本的檔案重新用utf 210.59.147.226 12/11 19:00
48F:→ donkeychen:-8的方式開啟 而是等下次開啟才是用UTF 210.59.147.226 12/11 19:01
49F:→ donkeychen:-8開 210.59.147.226 12/11 19:01
50F:→ donkeychen:回到最初的問題 感謝各位大大告知這是 210.59.147.226 12/11 19:03
51F:→ donkeychen:BIG5跟UTF-8 :) 210.59.147.226 12/11 19:03
52F:推 purpose:原來你的問題這麼單純...一開始我還在猜 124.8.136.105 12/11 19:21
53F:→ purpose:你特地提google網址,到底是要進行什麼 124.8.136.105 12/11 19:21
54F:→ purpose:網路相關的活動... 124.8.136.105 12/11 19:22
55F:→ donkeychen:喔 抱歉我沒說明 那個網址只是google搜 210.59.147.226 12/12 09:12
56F:→ donkeychen:尋 搜尋欄位填的 值 210.59.147.226 12/12 09:12
57F:→ donkeychen:>_< 因為不知道編碼系統 對於這些東西 210.59.147.226 12/12 09:14
58F:→ donkeychen:不太有概念 如果有個類似低調還原的網 210.59.147.226 12/12 09:14
59F:→ donkeychen:址 把編碼KEY進去就能知道是哪套編碼 210.59.147.226 12/12 09:15
60F:→ donkeychen:就方便多了 210.59.147.226 12/12 09:15
61F:→ donkeychen:感謝 JustinHere 大大提供的網址 我在 210.59.147.226 12/12 09:54
62F:→ donkeychen:log檔前面加入BOM EFBBBF 就不會誤判了 210.59.147.226 12/12 09:55
※ 編輯: donkeychen 來自: 210.59.147.226 (12/12 09:55)
另外想請教一個案外案
由前面的例子
"複製"兩個字的utf-8是 複=E8A487 製=E8A3BD
想請教一下
如果這個utf-8編碼有再被編成
EFBFA8 (EFBFA = E)
EFBEA4
EFBE87
EFBFA8 (EFBFA = E)
EFBEA3
EFBEBD
這種編碼又是哪一套編碼呢
我看了這個網址的編碼
http://www.utf8-chartable.de/unicode-utf8-table.pl?start=65280
好像不太對
U+FFE8 ef bf a8 HALFWIDTH FORMS LIGHT VERTICAL
U+FFA4 ef be a4 HALFWIDTH HANGUL LETTER NIEUN
.....(後面就不貼了 應該不是)
※ 編輯: donkeychen 來自: 210.59.147.226 (12/12 10:12)
63F:推 purpose:沒有 EFBFA = E 這種事,那是你猜的吧 124.8.133.120 12/12 10:41
64F:→ purpose:ef bf a8 = 垂直線符號的 UTF-8 編碼值 124.8.133.120 12/12 10:42
65F:→ donkeychen:恩 這是我猜的 因為原本的E8被編成 210.59.147.226 12/12 11:04
66F:→ donkeychen:EFBFA8 遇到EX 都會是EFBFAX 所以 210.59.147.226 12/12 11:05
67F:→ donkeychen:這樣猜測 210.59.147.226 12/12 11:05
68F:→ donkeychen:上面的 EFBFA8EFBEA4EFBE87=複 210.59.147.226 12/12 11:06
69F:→ donkeychen:EFBFA8EFBEA3EFBEBD = 製 210.59.147.226 12/12 11:06
71F:→ yvb:請先看懂 UTF-8 怎麼將 Unicode 編碼吧. 220.136.37.75 12/12 11:08
73F:推 purpose:所謂的「U+數字」是指 code point不是任何 124.8.133.120 12/12 12:03
74F:→ purpose:一種編碼,只不過在這裡巧合的跟 E 好像 124.8.133.120 12/12 12:04
75F:→ purpose:有關聯,其實UTF-8編碼不是這樣轉換 124.8.133.120 12/12 12:04
恩 我的案外案感覺起來是
原本的utf-8編碼再度被編碼
我看了一下編碼後的結果去查 utf-8應該是無關的
所以我推測這個"不是"utf-8的編碼
至於他編碼的規則我猜測是這樣 因為我把EFBFA 改成 E
EFBF 改成 NULL
sed -i s/\xEF\xBE//g file
sed -i s/\xEF\xBF\xA0/\xE0/g file
sed -i s/\xEF\xBF\xA1/\xE1/g file
sed -i s/\xEF\xBF\xA2/\xE2/g file
sed -i s/\xEF\xBF\xA3/\xE3/g file
sed -i s/\xEF\xBF\xA4/\xE4/g file
sed -i s/\xEF\xBF\xA5/\xE5/g file
sed -i s/\xEF\xBF\xA6/\xE6/g file
sed -i s/\xEF\xBF\xA7/\xE7/g file
sed -i s/\xEF\xBF\xA8/\xE8/g file
sed -i s/\xEF\xBF\xA9/\xE9/g file
sed -i s/\xEF\xBF\xAA/\xEA/g file
sed -i s/\xEF\xBF\xAB/\xEB/g file
sed -i s/\xEF\xBF\xAC/\xEC/g file
sed -i s/\xEF\xBF\xAD/\xED/g file
sed -i s/\xEF\xBF\xAE/\xEE/g file
sed -i s/\xEF\xBF\xAF/\xEF/g file
是可以改回原本的utf-8的編碼
至於是什麼編碼模式我不甚清楚 所以問一下大家是否有知道
※ 編輯: donkeychen 來自: 210.59.147.226 (12/12 12:13)
76F:推 LPH66:yvb 貼的網址點進去看吧 你的問題裡面有解答 210.69.49.38 12/12 12:31
大大不好意思
我不太知道是指哪一段
我由下面這段往回推
================================================
例如,希伯來語字母alepe....
它屬於U+0080到U+07FF區域,這個表說明它使用雙位元組,110yyyyy 10zzzzzz.
十六進制的0x05D0換算成二進制就是101-1101-0000.
這11位數按順序放入"y"部分和"z"部分:11010111 10010000.
最後結果就是雙位元組,用十六進制寫起來就是0xD7 0x90,這就是這個字元aleph
================================================
複 = E8A487
變成 EFBFA8 EFBEA4 EFBE87
EFBFA8
二進位
1110____ 10______ 10______
1111 111111 101000
[F ] [F ][E ][8 ]
EFBEA4
1110____ 10______ 10______
1111 111110 100100
[F ] [F ][A ][4 ]
EFBE87
1110____ 10______ 10______
1111 111110 000111
[F ] [F ][8 ][7 ]
請問是這個原則嗎? 感謝
※ 編輯: donkeychen 來自: 210.59.147.226 (12/12 14:02)
77F:→ donkeychen:purpose大大我正拜讀您提到的文章 感謝 210.59.147.226 12/12 14:10
78F:推 kingstong:0xD7 0x90這是記憶體位址吧?!十六進位 1.170.167.225 12/12 14:15
79F:→ kingstong:只有0~F啊!比如255就是FF啊!如果說錯 1.170.167.225 12/12 14:16
80F:→ kingstong:抱歉不要鞭得太嚴重 1.170.167.225 12/12 14:16
81F:→ donkeychen:是16進位的表示 但是這邊不是指記憶體 210.59.147.226 12/12 14:21
82F:→ donkeychen:位置 而是一個值 差不多是 5號 跟 5的 210.59.147.226 12/12 14:22
83F:→ donkeychen:關係 210.59.147.226 12/12 14:22
84F:推 kingstong:0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F到E就 1.170.167.225 12/12 14:25
85F:→ donkeychen:請問如果有來亂我可以刪推文嗎? 210.59.147.226 12/12 14:27
86F:→ kingstong:進一位,比如十六進制中1A=11,1A是十六進 1.170.167.225 12/12 14:30
87F:→ azureblaze:不要理他就好了 1.34.63.98 12/12 14:31
88F:推 purpose:你算的過程沒錯,只是我完全無法理解為何 124.8.133.120 12/12 14:39
89F:→ purpose:要把 e8 a4 87,分別加上 FF 又學 UTF-8 124.8.133.120 12/12 14:40
90F:→ purpose:的方式編碼,目的?也許是要簡單加密吧 124.8.133.120 12/12 14:41
91F:推 kingstong:更正!1A是十進位裡的26 1.170.167.225 12/12 14:42
92F:推 kingstong:BINARY是二進位檔,是最原始的1,0構成的 1.170.167.225 12/12 14:46
93F:→ kingstong:二進位檔,是機器語言. 1.170.167.225 12/12 14:47
94F:→ donkeychen:purpose大大我不排除code有做"冗餘" or 210.59.147.226 12/12 14:50
95F:→ donkeychen:不省空間的德州佬行為畢竟是別人的code 210.59.147.226 12/12 14:51
96F:→ donkeychen:但是在各位的指導上對於編碼更有概念了 210.59.147.226 12/12 14:52
97F:推 kingstong:0F(16進制)=15(十進制) 1.170.167.225 12/12 14:55
98F:→ kingstong:10(十六進制)=16(十進制),沒到X 1.170.167.225 12/12 14:57
99F:推 kingstong:快點來鞭我或指導我,讓我也進步一下 1.170.167.225 12/12 15:11
100F:→ kingstong:當你們好心來指導後進.雖然我不懂 1.170.167.225 12/12 15:12
101F:推 kingstong:P大,0x90換算成十進制是多少?!真心發問 1.170.167.225 12/12 23:21
102F:→ kingstong:非反串.該怎麼換算?! 1.170.167.225 12/12 23:22
104F:→ purpose:別算這種無聊的東西,跟我一起去八卦亂板 124.8.133.120 12/13 00:20
105F:→ azureblaze:于同學的問題應該是0x90的"x" 1.34.63.98 12/13 00:43
106F:→ azureblaze:那不是愛克斯,是乘號 因此0x90 = 0 1.34.63.98 12/13 00:43
我都俗氣的唸 叉...
107F:推 yvb:其實案外案的問題, 我認為應該應是程式的bug. 220.136.37.75 12/13 01:10
108F:→ yvb:它可能假設資料為ASCII,要轉成Unicode(UCS2), 220.136.37.75 12/13 01:11
109F:→ yvb:但又未慮 char 為 signed char, 因此 220.136.37.75 12/13 01:12
110F:→ yvb:(short)((char)0x87) 就變成了 0xff87 220.136.37.75 12/13 01:13
111F:→ yvb:此時再UCS2轉UTF8, 就變成 0xEF 0xBE 0x87 了. 220.136.37.75 12/13 01:14
112F:→ yvb:應該應是 => 應該是; 未慮 => 未考慮 220.136.37.75 12/13 01:16
113F:→ yvb:(這邊假設 char 為 8bits, short 為 16bits) 220.136.37.75 12/13 01:19
一開始不知道這也是符合utf-8 encode
以為是另一套編碼
現在看起來似乎是在string與wstring轉換時
出現這樣的問題
code如下
(有用到boost)
using namespace std;
using namespace boost; wstring path = L"複製";
//http://ppt.cc/yK88
string path2 = boost::to_utf8(path);
//http://ppt.cc/eAm2
wstring path3;
path3.assign(path2.begin(), path2.end()); //to log
//http://ppt.cc/nQ7b
//我猜是上面這行有問題
locale old_locale;
locale utf8_locale(old_locale,
new boost::program_options::detail::utf8_codecvt_facet);
filesystem::wpath asPath(L"C:\\test.log");
wofstream logfile;
logfile.imbue(utf8_locale);
if(!logfile.is_open())
{
logfile.open(asPath.external_file_string().c_str(),
ios::in |
ios::out |
ios::app |
ios::ate |
ios::binary);
}
logfile << path3;
logfile.close();
在C:\test.log就會有精美的
EFBFA8EFBEA4EFBE87EFBFA8EFBEA3EFBEBD 了
http://ppt.cc/wEJA
※ 編輯: donkeychen 來自: 210.59.147.226 (12/13 10:12)
114F:推 kingstong:阿......謝謝賜教,不過你們到底多八卦?! 1.170.167.225 12/13 09:50
115F:→ kingstong:不要于同學的一直叫,一切都是誤會 1.170.167.225 12/13 09:52
116F:→ kingstong:是我技不如人惹到不該惹得人,拜託別傳了 1.170.167.225 12/13 09:53
118F:推 POWERPC:原PO的問題Babel Pad完全決解,去玩玩看吧 111.241.36.113 12/13 11:28
119F:→ donkeychen:大大用Babel Pad開Big5的檔案會亂碼耶 210.59.147.226 12/13 14:49
120F:推 POWERPC:ANSI格式要在開啟時選語區才可,這不像 111.248.112.18 12/14 13:27
121F:→ POWERPC:WORD會自動辨別這程式是內定在U碼下運作的 111.248.112.18 12/14 13:29
122F:→ POWERPC:我所建立的所有CJKV字碼U-8都是用這轉成的 111.248.112.18 12/14 13:32
123F:→ POWERPC:這程式可讀別家所不可讀的UTF32文件檔 111.248.112.18 12/14 13:34
124F:→ sunneo:這不是于同學嗎?還原度可真高啊 140.127.114.38 12/14 16:05
125F:→ donkeychen:POWERPC大大 感謝:) 210.59.147.226 12/17 13:54