全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3807
推到 Plurk!
推到 Facebook!

中文亂碼問題

答題得分者是:tick228
ashin123
一般會員


發表:2
回覆:6
積分:1
註冊:2016-09-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2016-09-22 16:29:53 IP:122.146.xxx.xxx 訂閱
我剛接觸這個有個問題想請教
Memo1->Lines->Add(L"" str); //這樣還是話出現亂碼

是我的IDE有哪邊沒有設定到還是有其他的問題呢?
以上在麻煩各位大大解答
herbert2
尊榮會員


發表:58
回覆:640
積分:894
註冊:2004-04-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2016-09-22 20:57:55 IP:202.39.xxx.xxx 訂閱
您是否寫反了?
似應寫成 UnicodeString str = L"測試測試";
各位大大 你好~
請問一下變數如果是中文的話顯示會出現亂碼,這要怎麼處理?
EX

UnicodeString str = "測試測試";
Memo1->Lines->Add(L"" str); //這樣還是話出現亂碼

是我的IDE有哪邊沒有設定到還是有其他的問題呢?
以上在麻煩各位大大解答
ashin123
一般會員


發表:2
回覆:6
積分:1
註冊:2016-09-22

發送簡訊給我
#3 引用回覆 回覆 發表時間:2016-09-23 10:03:39 IP:122.146.xxx.xxx 訂閱
DEAR  H大

抱歉~
我的問題可能沒有說的很清楚
因為我現在是將TXT檔裡面的值讀出來進行MEMO的放入
所以如果沒辦法先將讀到的內容先宣告成 str = L"測試測試";
所以想請問是否可已在要寫入到元件的時候在改型態

在麻煩指教一下,如果我問題不請楚的話我會在附上範例
THX~


===================引 用 herbert2 文 章===================
您是否寫反了?
似應寫成 UnicodeString str = L"測試測試";
各位大大 你好~
請問一下變數如果是中文的話顯示會出現亂碼,這要怎麼處理?
EX

UnicodeString str = "測試測試";
Memo1->Lines->Add(L"" str); //這樣還是話出現亂碼

是我的IDE有哪邊沒有設定到還是有其他的問題呢?
以上在麻煩各位大大解答
ashin123
一般會員


發表:2
回覆:6
積分:1
註冊:2016-09-22

發送簡訊給我
#4 引用回覆 回覆 發表時間:2016-09-26 09:01:01 IP:122.146.xxx.xxx 訂閱
FILE *iflie;
iflie = fopen(AnsiString(path).c_str(), "r");
ComboBox->Clear();
char txt[4096];
while (fgets(txt, 4095, iflie) != NULL) {
str = (AnsiString)txt;
ComboBox->Items->Add(str);
}
fclose(iflie);

用範例讓各位大大了解一下我的問題
目前希望可以將TXT檔的內容讀入ComboBox中
但在ComboBox中就會顯示亂碼,請問一下各位有甚麼解決的方式

===================引 用 ashin123 文 章===================
DEAR H大

抱歉~
我的問題可能沒有說的很清楚
因為我現在是將TXT檔裡面的值讀出來進行MEMO的放入
所以如果沒辦法先將讀到的內容先宣告成 str = L"測試測試";
所以想請問是否可已在要寫入到元件的時候在改型態

在麻煩指教一下,如果我問題不請楚的話我會在附上範例
THX~


===================引 用 herbert2 文 章===================
您是否寫反了?
似應寫成 UnicodeString str = L"測試測試";
各位大大 你好~
請問一下變數如果是中文的話顯示會出現亂碼,這要怎麼處理?
EX

UnicodeString str = "測試測試";
Memo1->Lines->Add(L"" str); //這樣還是話出現亂碼

是我的IDE有哪邊沒有設定到還是有其他的問題呢?
以上在麻煩各位大大解答
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2016-09-26 15:12:39 IP:183.239.xxx.xxx 訂閱
Delphi 的版本?D7之前,它不支持 unicode,需要自己处理。

如果是最近两年的版本,对于 Unicode 的处理,delphi 的 string 已经是支持 Unicode 的了。

具体你碰到的是什么问题?看你的帖子,看不出来你的具体问题是什么。如果是一个 TXT 文件的话,似乎应该是没有问题的。
ashin123
一般會員


發表:2
回覆:6
積分:1
註冊:2016-09-22

發送簡訊給我
#6 引用回覆 回覆 發表時間:2016-09-26 15:26:31 IP:122.146.xxx.xxx 訂閱
你好~
我是使用C BUILDER XE 10.1版本
在一般的VCL中是可以正常顯示的,但當編譯成ANDROID就會出現亂碼
想請問一下是否有解決方案
我把問題簡化一下
是否可已在寫入元件前將字串的型態進行轉換呢?
EX
UnicodeString str = "測試測試";
Memo1->Line->add(str); //是否可以不要在一開始宣告成 str = L"測試測試"
有甚麼方式可已在Memo1中顯示不是亂碼呢?

以上在麻煩各位大大指教,這問題一直困擾著我

===================引 用 pcplayer99 文 章===================
Delphi 的版本?D7之前,它不支持 unicode,需要自己处理。

如果是最近两年的版本,对于 Unicode 的处理,delphi 的 string 已经是支持 Unicode 的了。

具体你碰到的是什么问题?看你的帖子,看不出来你的具体问题是什么。如果是一个 TXT 文件的话,似乎应该是没有问题的。
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2016-09-29 11:47:02 IP:183.239.xxx.xxx 訂閱
C BUILDER 就不清楚了。

你的意思是你在 CODE 里面写的 Memo1.Lines.Add('abcd') 这个 abcd 在 Android 里面显示乱码?

你的这个 abcd 是直接写进去的,还是:

S: string;

S := 'abcd';

Memo1.Lines.Add(S); 这样写进去的?
ashin123
一般會員


發表:2
回覆:6
積分:1
註冊:2016-09-22

發送簡訊給我
#8 引用回覆 回覆 發表時間:2016-09-29 11:53:03 IP:122.146.xxx.xxx 訂閱
DEAR P大

沒錯,就是這個意思
但英文不會出現論碼,中文才會


===================引 用 pcplayer99 文 章===================
C BUILDER 就不清楚了。

你的意思是你在 CODE 里面写的 Memo1.Lines.Add('abcd') 这个 abcd 在 Android 里面显示乱码?

你的这个 abcd 是直接写进去的,还是:

S: string;

S := 'abcd';

Memo1.Lines.Add(S); 这样写进去的?
tick228
高階會員


發表:1
回覆:47
積分:104
註冊:2003-11-03

發送簡訊給我
#9 引用回覆 回覆 發表時間:2016-09-29 13:18:20 IP:49.217.xxx.xxx 未訂閱
要讀取文字檔, 會有內碼的問題(ASCII, UTF8, UTF16...),
自已開檔讀取, 需要讀取前置字元判斷內碼,
才知讀取後, 需不需做轉碼.

建議使用 TStrings 的 LoadFromFile() 功能,
TStrings 會自動處理內碼問題.
例: Memo.Lines.LoadFromFile(FileName);
ashin123
一般會員


發表:2
回覆:6
積分:1
註冊:2016-09-22

發送簡訊給我
#10 引用回覆 回覆 發表時間:2016-10-03 17:13:00 IP:122.146.xxx.xxx 訂閱
DEAR T大

感謝你的回覆

我有試過了
如果TXT檔在存檔時是使用UTF-8的格式儲存
利用LoadFromFile函式是可以讀取的
Memo1->Lines->LoadFromFile("D:\\UTF-8.txt");

但人生最機掰的就是這個BUT!!

在TXT檔預設儲存的格式是ANSI
所以使用這個函式就會出現錯誤
Memo1->Lines->LoadFromFile("D:\\ANSI.txt");

錯誤訊息為
no mapping for the unicode character exists in the target multibyte code page

在請教一下有什麼方式可以解決

THX~










===================引 用 tick228 文 章===================
要讀取文字檔, 會有內碼的問題(ASCII, UTF8, UTF16...),
自已開檔讀取, 需要讀取前置字元判斷內碼,
才知讀取後, 需不需做轉碼.

建議使用 TStrings 的 LoadFromFile() 功能,
TStrings 會自動處理內碼問題.
例: Memo.Lines.LoadFromFile(FileName);
tick228
高階會員


發表:1
回覆:47
積分:104
註冊:2003-11-03

發送簡訊給我
#11 引用回覆 回覆 發表時間:2016-10-04 11:36:32 IP:49.216.xxx.xxx 未訂閱
在 Android 系統下, 並不直接支援 ANSI Code (Android 系統內定 Code page 為 UTF8),
查看 TStrings 的 Source, LoadFromFile() 並沒判斷 ANSI (這應是 FMX 的 Bug).

所以, 可以試試下列方法:

1. 將所有文字檔, 皆存成 UTF8.

2. 強制用 ANSI(或 ASCII) 碼讀取, 如 LoadFromFile(FileName, TEncoding.ANSI) 或
LoadFromFile(FileName, TEncoding.ASCII)

試試吧!
ashin123
一般會員


發表:2
回覆:6
積分:1
註冊:2016-09-22

發送簡訊給我
#12 引用回覆 回覆 發表時間:2016-10-04 12:02:23 IP:122.146.xxx.xxx 訂閱
感謝T大

以測試成功可以使用
方式如下
Memo1->Lines->LoadFromFile(FileName, TEncoding::ANSI);



===================引 用 tick228 文 章===================
在 Android 系統下, 並不直接支援 ANSI Code (Android 系統內定 Code page 為 UTF8),
查看 TStrings 的 Source, LoadFromFile() 並沒判斷 ANSI (這應是 FMX 的 Bug).

所以, 可以試試下列方法:

1. 將所有文字檔, 皆存成 UTF8.

2. 強制用 ANSI(或 ASCII) 碼讀取, 如 LoadFromFile(FileName, TEncoding.ANSI) 或
LoadFromFile(FileName, TEncoding.ASCII)

試試吧!
系統時間:2024-04-26 23:28:53
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!