UTF-8與Shift-JIS文字代碼自力改變 |
|
conundrum
尊榮會員 發表:893 回覆:1272 積分:643 註冊:2004-01-06 發送簡訊給我 |
引言:http://homepage3.nifty.com/m-and-i/tips/utftosjis.htm UTF-8與Shift-JIS文字代碼自力改變(2004/4/24) Windows95WideCharToMultiByte API使用不能為了、自力改變為了的單位制定了。大致確認了、三維圖像正在隱藏釀不弄清因為、被使用人各自充分確認拜托。 Delphi 6擊打從標準UTF-8代碼改變函數被追加有、Delphi 3~5使進貢有與想。 辣醬油指標與位演算事多正在做為了、頗讀難過渡想。代碼改變興趣有人、以下的URL參照請。 http://homepage1.nifty.com/nomenclator/unicode/ucs_utf.htm ================================================================ UCS與UTF 單一碼文書做木,文字代碼的方式2種類,或翹曲以上某(有)特別氣息被沾也許。譬如,一Unicode某一卻比,另外一點Unicode (UTF-8)與被表記海豚焚燒れ籬笆。這2歲,另外,那個不同為什麼消化(前者UTF-16的一形態的因為沙灘…)。 UCS-2與UCS-4 UTF-16 UTF-8 UTF-7 UTF-32 UCS-2與UCS-4 單一碼被選定特別結多言語事情的文字代碼一組,ISO-10846-1,16位(16橫樑的二進制)各個的文字表面使安靜下來。翹曲UCS-2 (Universal Character Set coded in 2 octets,「2歲的八重唱代碼做了通用的文字一組」)與名稱使安靜下來。八重唱所謂文字長的單位作為的8位(8橫樑的二進制)的事。 單一碼的特定的文字,譬如,'A' 的文字如果,U 0041與寫表記。UCS-2,U 0000從U FFFF的文字用(可能性含)。 另外,再(且.更)多數的文字能包含象4個的八重唱用應該……UCS-4問有。UCS-4,UCS-2的文字對應文字,U 00000000從U 0000FFFF之外,U 00010000從U 7FFFFFFF的文字含(Unicode 3.0,具體的文字確定不有,建議的階段的表面)。 UTF (Unicode (or UCS) Transformation Format)所謂,這些UCS-2或 UCS-4作為被定義的文字字節行(可是本質的在……中位行假名)作為如何表現那個方式指,復數的方式有。 UTF-16 UTF-16,單一碼1文字,總是16位表現文字代碼。[RFC2781] 嚴密新水灣ばUTF-16在……中3種類有,各個UTF-16,UTF-16BE至UTF-16LE與呼喚。BE大en《日報》n 'Big Endian', LE小的en《日報》n 'Little Endian' 的大致。UCS-2的U 0041的文字(即 'A'),UTF-16BE00 41叫做2字節, UTF-16LE41 00叫做2字節表面使安靜下來。 一般的新水灣ば,UTF-16BEUCS-2的上位八重唱以前方式是,UTF-16LE下位八重唱以前方式。 UTF-16通常,文書的開始Byte Order Mark(BOM與被省略。「字節次序表現印」叫做表面的意思)靠。捆UCS-2U FEFF(UCS-4如果U 0000FEFF)表面做文字但是,文書的開頭的2字節BOM與思考(想法),那個大en《日報》n的FE FF如果以後UTF-16BE的象解釋,BOM小的en《日報》n的FF FE以後UTF-16LE的象解釋。 UTF-16,UTF-16BE,UTF-16LE的不同出示為了,'ABC'叫做3文字從結文書的構成出示如果其次的象結。 UTF-16BE 00 41 00 42 00 43 UTF-16LE 41 00 42 00 43 00 UTF-16的大en《日報》n FE FF 00 41 00 42 00 43 UTF-16的小的en《日報》n FF FE 41 00 42 00 43 00 UTF-16的BOM無 00 41 00 42 00 43 UTF-16BE或UTF-16LE在……中BOM不沾。沾義齒、U FEFF、即 ZWNBSP 作為的意思挺。焚燒逆的BOM正在沾們,單一碼U FFFE叫做文字被定義現在黃泉們,錯的某(有)文書叫做變成。 文字代碼UTF-16是做文書,開頭的2字節BOM作為解釋不能(FE FF但FF FE但搓)時,RFC2781煮れば,大en《日報》n作為被解釋特別正在搓。 Windows泥卯年Unicode文本所謂,小的en《日報》n的UTF-16。大en《日報》n的UTF-16,寫字板或Word讀即使的確不能念。改正Internet Explorer等的瀏覽器Unicode (Big Endian) 作為表示閱覽事如果成果。BOM的搓者,現在,UTF-16文書作為不被認識表面。 UTF-16,UCS-4相稱UCS-2挑文字農田(之中),U 10000從U 10FFFF的范圍,(unicode consortium的說殺死的)saro門一對作為表面使安靜下來。即,U D800從U DBFF到的文字上位saro門(high surrogate)年,U DC00從U DFFF到的文字下位saro門(low surrogate)作為,2歲的編在一起表現。為此,UTF-16,UCS-4的U 110000以後的文字表現不能。 UTF-16,U 10000從U 10FFFF的文字表現方法然後出示。 0x10000隻有扣除(捆 U' 表現不同)。U 10000 0x000000,U 10FFFF 0xFFFFF腹足類爐缸。 U' 20位的2進數目作為表現。 上位saro門W1,下位saro門W2如果那樣,以下的關系腹足類爐缸。即,U'的上位10位的上乘 '110110' 附上 W1年,下位10位的上乘 '110111' 附上 W2作為。 U' = yyyyyyyyyyxxxxxxxxxx (UCS-4 = U 從0x10000隻有扣除數目) W1 = 110110yyyyyyyyyy (上位saro門:D800..DBFF腹足類爐缸) W2 = 110111xxxxxxxxxx (下位saro門:DC00..DFFF腹足類爐缸) 譬如,U 12345如果,D8 08 DF 45與編碼做(UTF-16BE的時)。UTF-16LE如果,08 D8 45 DF的4字節。 UTF-8 UCS-2ASCII文字也包含了所有文字2字節表面做。上奏與ASCII代碼與甚至也兼容性啊祈禱,未必使不平靜。於是,ASCII兼容性保持因此被做的是…(隻有這個的理由不是也許)UTF-8(Unicode (or UCS) Transformation Format, 8-bit encoding form)。[Unicode Standard 4.0, RFC3629, RFC2279 (obsolete) 和 RFC2044 (obsolete)] UCS-2ASCII文字在……中無效的文字00 一定正在沾卻比,UTF-8那個必要沒有。另外,BOM也有籬笆。UTF-8在……中FE 或FF 這種字節被含...的事沒有。為此,UTF-16的BOM與混入事沒有。 ASCII文字1字節表面做代替,希臘字母或俄羅斯文字2字節,漢字或假名等3字節腹足類裡。UCS-2 (UCS-4) 與UTF-8的之間,其次的關系有(U 200000以後也方法被定義有省略)。 UCS從UTF-8往的改變規章 UCS-2 (UCS-4) 位模式 第1字節 第2字節 第3字節 第4字節 U 0000 .. U 007F 00000000-0xxxxxxx 0xxxxxxx U 0080 .. U 07FF 00000xxx-xxyyyyyy 110xxxxx 10yyyyyy U 0800 .. U FFFF xxxxyyyy-yyzzzzzz 1110xxxx 10yyyyyy 10zzzzzz U 10000..U 1FFFFF 00000000-000wwwxx- xxxxyyyy-yyzzzzzzz 11110www 10xxxxxx 10yyyyyy 10zzzzzz 看的通,UTF-8,錯誤ASCII文字在……中MSB(最高位位)立(1變成)代碼(二進制10000000從11111111的文字)用因為ASCII所謂完全被區別。另外,文字的順序,UCS-2與UTF-8不變。 1字節的文字[00-7F]是,2字節的文字[C2-DF]+[80-BF]是,3字節的文字[E0-EF]+[80-BF]+[80-BF]的配合鄰。UTF-8的關鍵的標點,1文字什麼字節是,前頭字節讀人多階段明白戳子爐缸叫做標點。夜裡,UTF-8的字符串處理時,前頭從依次讀假如人多正確的解釋處理成果。倒(相反),中途從挑出了部分字符串,未必的確處理成果籬笆。 UTF-8作為正當的字節行,其次的象能解決。UTF-16 表現不能U D800..U DFFF的范圍和U 110000以後的文字不準確。 正當的UTF-8的字節行 代碼要點 第1字節 第2字節 第3字節 第4字節 U 0000..U 007F 00..7F U 0080..U 07FF C2..DF 80..BF U 0800..U 0FFF E0 A0..BF 80..BF U 1000..U CFFF E1..EC 80..BF 80..BF U D000..U D7FF ED 80..9F 80..BF U E000..U FFFF EE..EF 80..BF 80..BF U 10000..U 3FFFF F0 90..BF 80..BF 80..BF U 40000..U FFFFF F1..F3 80..BF 80..BF 80..BF U 100000..U 10FFFF F4 80..8F 80..BF 80..BF 注意應該,C0 80 或E0 80 80那樣的字節行。UCS從UTF-8往的改變規章,UTF-82字節或3字節腹足類爐缸行與比,x,y,z的位一切0變成偶爾,C0 80或E0 80 80成為象拜見。這些UCS-2的U 0000與對應象能感覺也許。 UTF-8 UCS-2 110xxxxx-10yyyyyy 00000xxx-xxyyyyyy C0 80 = 11000000-10000000 → 00000000-00000000 =U 0000 ? 1110xxxx-10yyyyyy-10zzzzzz xxxxyyyy-yyzzzzzzE0 80 80 = 11100000-10000000-10000000 → 00000000-00000000 =U 0000 ? 可是,這樣的字節行[RFC2279]煮れば不正當(illegal)是,不能認同。堵塞UTF-8,U 0000從U 007F的文字總是1字節是,U 0080從U 07FF的文字總是2字節不不許不結。 Unicode,往返改變(roundtrip)保証應該。`UTF-8'的C0 80UCS-2的U+0000對應靠表面的程序,那個UCS-2再次UTF-8改變了偶爾00挑做完。這樣的事態不喜歡的。所以,C0 80那樣的字符串「不正當」富裕沒有不れ傻的裡籬笆。 `UTF-8'的C0 80UCS-2的U+0000對應靠表面的程序,譬如,某(有)種子的危險的字符串(命令色彩等)除去處理底下箭尾的卻,沒被除去叫做表面的事態起凍僵。所以,上部的表面有文字隻有正當的UTF-8文字與思索必要有(cf.RFC2279, Security Considerations)。 更,UTF-16saro門一對作為表現文字,UTF-84字節表面使安靜下來。譬如,UCS-4的U 010000,UTF-16BE D8 00 DC 00作為被表現,捆UTF-8表現時,F0 90 80 80年不れ傻的裡籬笆。saro門一對模仿,U D800,U DC00的2文字與思索,ED A0 80 ED B0 80與6字節表現的是不插。U D800,U DC00那樣的saro門一對的范圍、Unicode 3.2 以後、不準確因為使爬毛馬千。 UTF-7 郵件單一碼用可以(能)象,UTF-7叫做,7位的編碼方式也有。[RFC2152 和 RFC1642 (obsolete)]被陳述有。 UTF-7BASE64房基作為編碼規章,字符串3種子的部分分。 Set D (directly encoded characters)。直接埋眼睛擁擠文字:A-Z, a-z, 0-9達到其次的9文字(" " 與 "=" 被除外)。 文字 ' ( ) , - . / : ? 10進 39 40 41 44 45 46 47 58 63 Set O (optional direct characters)。 直接埋眼睛人多將要……的樣子文字:其次的20文字("\" 與 "~" 被除外)。 文字 ! " # $ % & * ; < = > @ [ ] ^ _ ` { | } 10進 33 34 35 36 37 38 42 59 60 61 62 64 91 93 94 95 96 123 124 125 Set B (Modified Base64)。褥墊文字 "=" UTF-7不用。 更,BASE64的羅馬字母以下的通。 Table 1: The Base64 Alphabet [RFC2045] Value Encoding Value Encoding Value Encoding Value Encoding 0 A 17 R 34 i 51 z 1 B 18 S 35 j 52 0 2 C 19 T 36 k 53 1 3 D 20 U 37 l 54 2 4 E 21 V 38 m 55 3 5 F 22 W 39 n 56 4 6 G 23 X 40 o 57 5 7 H 24 Y 41 p 58 6 8 I 25 Z 42 q 59 7 9 J 26 a 43 r 60 8 10 K 27 b 44 s 61 9 11 L 28 c 45 t 62 12 M 29 d 46 u 63 / 13 N 30 e 47 v 14 O 31 f 48 w (pad) = 15 P 32 g 49 x 16 Q 33 h 50 y UTF-7編碼在……中其次的次序根據行為。 Set D的單一碼文字等價的ASCII文字作為編碼。Set O屬於文字直接編碼即使……傍晚,郵件頁眉的構成文字作為……來說不可以使用者許多事等扇軸注意是。 其他的文字BASE64編碼。Set D or Set O從Set B往的轉換偶爾 " " 進入。Set BBASE64羅馬字母不出去文字的出現根據終了,之間最後頭兒文字作為 "-" 放入將要……的樣子。Set B領域繼續Set D or Set O領域的開頭的文字 "-" 是木,必定最後頭兒文字作為多余的 "-" 放入。 最後頭兒文字,連續Set D or Set O領域的開頭文字BASE64羅馬字母的一個是偶爾必需是。 " " 的文字本身," -" 叫做字符串表現。 Set B埋眼睛人多Unicode字符串,UTF-16作為從BASE64編碼。 SPACE, TAB, LF, CRASCII作為埋眼睛人多將要……的樣子。 常例:"日語" 叫做字符串,U 65E5,U 672C,U 8A9E因此, ZeVnLIqe-與編碼。 011001-011110-010101-100111-001011-001000-101010-011110 25 32 21 39 11 8 42 30 Z e V n L I q e 常例:U 263A = 001001-100011-1010 ,001001-100011-101000與後位補充了饑餓, Jjo-與編碼。 UTF-32 UTF-32,單一碼1文字,總是32位表現文字代碼。[Unicode Technical Report #19] UTF-32與UCS-4的不同,UTF-32UTF-16與一樣,U 0000從U 10FFFF到的范圍隻有有效不是事。堵塞,UTF-32UCS-4的輔助銀行一組問凍僵。 嚴密新水灣ばUTF-32在……中3種類有,各個UTF-32,UTF-32BE至UTF-32LE與呼喚。礦區爐缸與預想…月久富焚燒れ籬笆,這些的不同UTF-16能登同樣。 UTF-32UTF-16那樣的saro門一對不用。U 10203的文字如果,UTF-32BE00 01 02 03與編碼れ,UTF-32LE如果03 02 01 00作為被表現。 UTF-32BOM,UCS-4的U FEFF表面做文字。文書的開頭的4字節BOM與思考(想法),那個大en《日報》n的00 00 FE FF如果以後UTF-32BE的象解釋,BOM小的en《日報》n的FF FE 00 00如果以後UTF-32LE的象解釋。BOM假如是,翹曲僅字節次序表現為了野母因為合適,文書構成文字所謂不看作。BOM如果不是,全體大en《日報》n是看作解釋。 UTF-32,UTF-32BE,UTF-32LE的不同出示為了,'ABC'叫做3文字從結文書的構成出示如果其次的象結。 UTF-32BE 00 00 00 41 00 00 00 42 00 00 00 43 UTF-32LE 41 00 00 00 42 00 00 00 43 00 00 00 UTF-32的大en《日報》n 00 00 FE FF 00 00 00 41 00 00 00 42 00 00 00 43 UTF-32的小的en《日報》n FF FE 00 00 41 00 00 00 42 00 00 00 43 00 00 00 UTF-32的BOM無 00 00 00 41 00 00 00 42 00 00 00 43 ================================================================ 從這裡…情況之下utftosjis.pas作為保存、程序庫路徑的來往了文件夾保存請。更、使用時候Uses季節utftosjis追加請。 (* UTF-8 <-> SJIS 互相改變 Windows95WideCharToMultiByte API使用不能為了、自力改變 舉行。 代碼改變廢棄結SJIS改變夜裡也、既然Unicode(USC-2) 改變人樂音掌舵(好像)っ田野那樣的。 以下參閱作為貞操甓知行氏的頁。感謝m(__)m http://homepage1.nifty.com/nomenclator/unicode/ucs_utf.htm Unicode也是假如做完、後(痕跡)String模具代入隻有Delphi自動 確切SJIS也是天黑因為非常樂音。 Copyright(c) 2004/4/24 M&I *) unit Utf8tosjis; interface uses Windows, Sysutils; // UTF-8(BOM沾) -> SJIS function UTFtoSJIS(UTFStr: string): string; // UTF-8N -> SJIS function UTFNtoSJIS(UTFStr: string): string; // SJIS -> UTF-8(BOM沾) function SJIStoUTF(Str: string): string; // SJIS -> UTF-8N function SJIStoUTFN(Str: string): string; implementation // UTF-8SJIS改變 function UTF82Sjis(UTFStr: string): string; var usc2, uc: PChar; pwc: PWideChar; len: integer; un: WORD; begin Result := ''; len := Length(UTFStr); // 字符串的終了化驗出因此崗哨4人立 uc := PChar(UTFStr #0#0#0#0); // 安全看4加倍的內存確保 usc2 := AllocMem(len * 4); // usc2指標作為使用因為pwc前頭地址保存 pwc := PWideChar(usc2); try while uc^ <> #0 do begin // ASCII if uc^ in [#0..#$7F] then begin usc2^ := uc^; (usc2 1)^ := #0; Inc(usc2, 2); Inc(uc); // 2byte文字那個1 end else if uc^ in [#$C0.. #$DF] then begin un := (Ord(uc^) and $1F) shl 6 Ord((uc 1)^) and $3F; usc2^ := Char(Lo(un)); (usc2 1)^ := Char(Hi(un)); Inc(usc2, 2); Inc(uc, 2); // 2byte文字那個2 end else if uc^ in [#$E0..#$EF] then begin un := (Ord(uc^) and $0F) shl 12 (Ord((uc 1)^) and $3F) shl 6 (Ord((uc 2)^) and $3F); usc2^ := Char(Lo(un)); (usc2 1)^ := Char(Hi(un)); Inc(usc2, 2); Inc(uc, 3); // 4byte文字(USC-4喝) end else if uc^ in [#$F0..#$F7] then begin un := (Ord(uc^) and $07) shl 2 (Ord((uc 1)^) shr 4) and $03; usc2^ := Char(Lo(un)); (usc2 1)^ := Char(Hi(un)); Inc(usc2, 2); Inc(uc); un := ((Ord(uc^) shl 4) and $F0) (Ord((uc 1)^) and $3F) shl 6 (Ord((uc 2)^) and $3F); usc2^ := Char(Lo(un)); (usc2 1)^ := Char(Hi(un)); Inc(usc2, 2); Inc(uc, 3); end else raise Exception.Create('UTF-8 Unknown code.'); end; // UTF從改變了UnicodeString模具歸還。隻有這個Sjis腹足類っ印度絹織品 Result := pwc; finally FreeMem(pwc); end; end; // SJISUTF-8改變 function SJIS2UTF(Str: string): string; var uc, sc: PChar; usc2: PWideChar; pw: ^Word; //w1, w2: Word; len: integer; begin Result := ''; len := Length(Str); usc2 := AllocMem(len * 4 4); pw := Pointer(usc2); try uc := AllocMem(len * 3 3); sc := uc; try // 既然Unicode改變 StringToWideChar(Str, usc2, len * 4); while pw^ <> 0 do begin {這裡USC-4的處理。Uninode(USC-2)不用。順便未確認。 // 00000000-000wwwxx-xxxxyyyy-yyzzzzzz if ((pw^ and $FFE0) = 0) and ((pw2^ and $F800) <> 0) then begin w1 := pw^; Inc(pw); w2 := pw^; Inc(pw); // 11110www uc^ := Char($F0 (w2 shr 2)); Inc(uc); // 10xxxxxx uc^ := Char($80 ((w2 and $03) shl 4) (w1 shr 12)); Inc(uc); // 10yyyyyy uc^ := Char($80 ((w1 shr 6) and $3F)); Inc(uc^); // 10zzzzzz uc^ := Char($80 (w1 and $3F)); Inc(uc); // 00000000-0xxxxxxx end else } if (pw^ and $FF80) = 0 then begin uc^ := Char(Lo(pw^)); Inc(uc); Inc(pw); // 00000xxx-xxyyyyyy end else if (pw^ and $F800) = 0 then begin // 110xxxxx uc^ := Char($C0 (pw^ shr 6)); Inc(uc); // 10yyyyyy uc^ := Char($80 (pw^ and $3F)); Inc(uc); Inc(pw); // xxxxyyyy-yyzzzzzz end else begin // 1110xxxx uc^ := Char($E0 (pw^ shr 12)); Inc(uc); // 10yyyyyy uc^ := Char($80 ((pw^ shr 6) and $3F)); Inc(uc); // 10zzzzzz uc^ := Char($80 (pw^ and $3F)); Inc(uc); Inc(pw); end; end; uc^ := #0; Result := sc; finally Freemem(sc); end; finally FreeMem(usc2); end; end; // UTF-8(BOM沾) -> SJIS function UTFtoSJIS(UTFStr: string): string; begin Delete(UTFStr, 1, 3); Result := UTF82Sjis(UTFStr); end; // UTF-8N -> SJIS function UTFNtoSJIS(UTFStr: string): string; begin Result := UTF82SJIS(UTFStr); end; // SJIS -> UTF-8(BOM沾) function SJIStoUTF(Str: string): string; begin Result := #$EF#$BB#$BF SJIS2UTF(Str); end; // SJIS -> UTF-8N function SJIStoUTFN(Str: string): string; begin Result := SJIS2UTF(Str); end; end. |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |