如何存一個unico格式的文字檔 |
尚未結案
|
cosuki
一般會員 發表:10 回覆:40 積分:10 註冊:2003-06-05 發送簡訊給我 |
|
cosuki
一般會員 發表:10 回覆:40 積分:10 註冊:2003-06-05 發送簡訊給我 |
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
|
cosuki
一般會員 發表:10 回覆:40 積分:10 註冊:2003-06-05 發送簡訊給我 |
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
|
TATSU
版主 發表:50 回覆:135 積分:62 註冊:2003-01-16 發送簡訊給我 |
就 Unicode 的文字檔格式,它們都會在檔案開首加入特別的字元以識別類型: unicode 或者叫做 unicode little endian,PC上用的都是 LE 格式,首兩個 byte 是
FF FE unicode big endian,首兩個 byte 是
FE FF 而另一種的 UTF-8 格式,首三個 byte 是
EF BB BF LE(litte endian) 與 BE(big endian)兩者分別很明顯,LE 儲存文字時,high byte 跟 low byte 的位置是調換,而 BE 就儲存原來的 high , low byte 的位置。 中 內碼:A4A4 UNICODE:4E2D UTF-8:E4 B8 AD
文 內碼:A4E5 UNICODE:6587 UTF-8:E6 96 87
做一個文字檔案輸入「中文」兩個字,儲存了,文字檔案的內容就是:
A4 A4 A4 E5
這四個 bye 轉換成 unicode (LE) ,內容就是
FF FE 2D 4E 87 65 轉換成 unicode (BE) ,內容就是
FE FF 4E 2D 65 87 如果你的文字檔中有分行
轉換成 unicode (LE) ,內容就是
FF FE 2D 4E 0D 00 0A 00 87 65 轉換成 unicode (BE) ,內容就是
FE FF 4E 2D 00 0D 00 0A 65 87 而 UTF-8 的儲存格式,就是將一些單位元的字仍以單位元存檔,而那些雙位元都以三個或四個位元去代表
EF BB BF E4 B8 AD 0D 0A E6 96 87 由以上的例子可知,你轉換了一些字串後,要儲存成文字檔時,先要寫入兩個或三個識別位元,再可以寫入你那些已轉換的字串。 這個是我以往在網上搜查,及往後一些轉換 unicode 的經驗,如果其他人發現有錯誤,請代為補充及更正。 發表人 - tatsu 於 2004/03/11 03:35:22
|
s8556026
一般會員 發表:10 回覆:43 積分:15 註冊:2003-07-26 發送簡訊給我 |
引言: 有沒有人知道咩... 我試了一天了.. 若用以下面式存文字檔,是會存成unicode big endian,不是unicode FOR I:=0 TO LENGTH(TMP) DO BEGIN write(F2,TMP[i]); END; 但中文字會變亂碼.. 但textfile只接受string,各char格式..有誰能幫幫忙咩 還是有什麼轉換物件可以call... 我想要匯出文字檔是unicode格式的啦..很急...><我想問題是 TextFile… 還有一個是 File 但是用法不一樣 要用 WINDOW 的 API var f:integer; wbuff:array[0..1] of byte; begin f := FileOpen('c:\ss.txt',fmOpenWrite); FileWrite(f,wbuff,2); 如果用 TextFile 開副檔名不是 .txt 的檔也會出錯… 發表人 - s8556026 於 2004/03/11 11:25:52 |
cosuki
一般會員 發表:10 回覆:40 積分:10 註冊:2003-06-05 發送簡訊給我 |
|
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
Hi, 試試看吧, 弟使用了 TFileStream 的方式進行操作, 將 WideString 寫入文字檔, 並配合文字檔的 LE Format 即可.
function WriteWideString2File(filename: string; ws: WideString):Boolean; const WideBOM_LSB_First = WideChar(#$FEFF); var wf: WideString; f: TFileStream; i: integer; begin Result := false; wf := WideBOM_LSB_First; f:= TFileStream.Create(filename, fmCreate); try f.Write(wf[1], 2); for i:= 1 to length(ws) do f.Write(ws[i], 2); Result := true; finally f.Free; end; end; procedure TForm1.Button1Click(Sender: TObject); var myws: WideString; begin myws := 'Delphi 的 Unicode 存檔測試'; WriteWideString2File('c:\test.txt', myws); end; |
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
早上再看了一下, 可以將中間的迴圈寫入的部分改得更快一些的做法, 利用 WideString 是由 WideChar 組合而成的概念來操作的, 這樣一次性的寫入應該會更快! 如:
function WriteWideString2File(filename: string; ws: WideString):Boolean; const WideBOM_LSB_First = WideChar(#$FEFF); var wf: WideString; f: TFileStream; i: integer; begin Result := false; wf := WideBOM_LSB_First; f:= TFileStream.Create(filename, fmCreate); try f.Write(wf[1], 2); //for i:= 1 to length(ws) do // f.Write(ws[i], sizeof(ws[i])); f.Write(PWideChar(ws)^, length(ws)*sizeof(WideChar)); Result := true; finally f.Free; end; end; |
cosuki
一般會員 發表:10 回覆:40 積分:10 註冊:2003-06-05 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |