這裡來講個基本的
大家都知道C++裡面儲存字串的東西是
Std::string(單字元)和Std::wstring(寬字元)
那C++ Builder裡面則是
AnsiString(單字元)和UnicodeString(寬字元)
基本上我習慣用C++裡面的變數,而不用C++ Builder裡面內建的變數(UnicodeString),原因在於我寫的程式是多執行緒程式,C++ Builder裡面一些底層都藏起來了,網路上也沒說他是不是thread safe
因此以防萬一,原則上有多執行緒的程式片段,盡量不要使用C++ Builder內建的型態,不是很保險,當然有些是thread safe但是C++ Builder其實他也沒講,程式碼怎做的也不知道,總之就是不保險
但其實這裡寫到UnicodeString應該是thread safe的
http://www.codenewsfast.com/cnf/thread/0/permalink.thr-ng1877q16781
至於那四個東西怎麼使用,這裡不講,其實是有辦法互相轉換的
例如AnsiStriing和UnicodeString可以直接轉,他會自動在單字元和寬字元做轉換
http://bbs.csdn.net/topics/370062441
UnicodeString US = L“test”;
AnsiString AS = “abc”;
US = UnicodeString(AS);
AS = AnsiString(US);
上面是可行的,但是您要知道要是寬字元有存一些外國字(例如日文或韓文),轉成單字元會出現亂碼,除非您把系統的字碼切換到該國語言的狀態下,但是中文就會變成亂碼了
另外
就我在XE7時試
Edit1->Text = “XXX”;
好像不行,因為他要UnicodeString(寬字元)
可是到XE10 berlin,竟然可以,會自動判斷
看起來還是有再精進
因此我原本要說他不行的(因為我XE7時印象中不行),現在新版好像都可以了
UnicodeString US = “test”;
他也會自動幫您轉成功
所以看起來這已經不是技巧了Orz
總之他需求類型是要UnicodeString這個,但是由於XE10 berlin版有再做精進
因此下面的語法會過
std::string fffe= "fsdfsd";
UnicodeString fff = fffe.c_str();
Caption = fffe.c_str();
所以請大家一起學習吧Orz,我剛看了才發現現在竟然已經可以了,比wstring還好用
但是您會問為什麼不用string呢,就是前面講的,string存一些日文或韓文會顯示亂碼,wstring和UnicodeString不會
其實有另一個原因是由於C++ Builder底層是Delphi做的,您只要Inlcude<vcl.h>或是相關的
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
…等
編譯速度會很慢(但是您要使用UnicodeString又要include<vcl.h>)
所以還是等C++ Builder改善編譯速度後再決定要不要使用C++ Builder的類型吧
沒有留言:
張貼留言