線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:6972
推到 Plurk!
推到 Facebook!

如何存一個unico格式的文字檔

尚未結案
cosuki
一般會員


發表:10
回覆:40
積分:10
註冊:2003-06-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-03-09 18:46:34 IP:61.219.xxx.xxx 未訂閱
如何存文字檔時,設定是用unico格式存檔的哩... 一般存文字檔時是ansi格式
cosuki
一般會員


發表:10
回覆:40
積分:10
註冊:2003-06-05

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-03-10 15:51:13 IP:61.219.xxx.xxx 未訂閱
有沒有人知道咩... 我試了一天了.. 若用以下面式存文字檔,是會存成unicode big endian,不是unicode FOR I:=0 TO LENGTH(TMP) DO BEGIN write(F2,TMP[i]); END; 但中文字會變亂碼.. 但textfile只接受string,各char格式..有誰能幫幫忙咩 還是有什麼轉換物件可以call... 我想要匯出文字檔是unicode格式的啦..很急...><
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-03-10 16:47:57 IP:202.39.xxx.xxx 未訂閱
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=32820 --- 屬於那自己生命的歌 不管是什麼顏色
cosuki
一般會員


發表:10
回覆:40
積分:10
註冊:2003-06-05

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-03-10 17:10:03 IP:61.219.xxx.xxx 未訂閱
我有看過這個文章,也有下載這個程式來玩 但就是不知他是怎麼做檔案轉碼的 delphi的textfile的 Writeln([ var F: Text; ] P1 [, P2, ...,Pn ] ); 是不是只能傳入string型能 我想傳WideString或widechar寫入檔案都不行耶....
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-03-10 17:57:45 IP:202.39.xxx.xxx 未訂閱
找了兩篇, 您研究看看. http://groups.google.com.tw/groups?hl=zh-TW&lr=&ie=UTF-8&oe=UTF-8&th=babe5c493268a927&rnum=8 http://groups.google.com.tw/groups?hl=zh-TW&lr=&ie=UTF-8&oe=UTF-8&th=e034e6bda7d50446&rnum=70 --- 屬於那自己生命的歌 不管是什麼顏色
TATSU
版主


發表:50
回覆:135
積分:62
註冊:2003-01-16

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-03-11 03:33:23 IP:203.218.xxx.xxx 未訂閱
就 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-03-11 11:22:50 IP:61.222.xxx.xxx 未訂閱
引言: 有沒有人知道咩... 我試了一天了.. 若用以下面式存文字檔,是會存成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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-03-19 19:30:02 IP:61.219.xxx.xxx 未訂閱
各位大大不好意思... 最新在趕其他支程式...所以還沒試大大們的方法.. 不過大大們的方法感覺得都很有希望... 不過要花時間試...只是在案子很趕又只有一個人在寫的情況下.. 有些要花時間試的技術可能要晚一點試了.... 不知有沒有好心的大大..有些小demo的,可以幫幫我哩.. 若不行我再找時間試,再來結案....真不好意思....
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-03-31 21:56:06 IP:61.62.xxx.xxx 未訂閱
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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-04-01 11:38:00 IP:203.95.xxx.xxx 未訂閱
早上再看了一下, 可以將中間的迴圈寫入的部分改得更快一些的做法, 利用 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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-04-01 12:57:08 IP:61.219.xxx.xxx 未訂閱
哇...感謝timhuang兄咩... 真的可以耶...謝謝你的幫忙... 真的幫我好大一個忙咩....小妹會好好努力和你學習的...^^
系統時間:2024-04-25 22:12:32
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!