Ansi字符转换为unicode?(50分)

  • 主题发起人 主题发起人 ymqpc
  • 开始时间 开始时间
Y

ymqpc

Unregistered / Unconfirmed
GUEST, unregistred user!
Ansi字符转换为unicode?<br>现有一个TMEMO的文件内容(可能很多行1000~5000行),想请教各位如何转换TMEMO的内容为Unicode字符,最好效率高一点.<br>就像VB一样只用一行代码就OK.<br>VB的代码是: TxtBox.Text = StrConv(InputB$(LOF(1), 1), vbUnicode)<br>
 
StringToWideChar
 
在delphi中可以直接转换的<br>例:TxtBox.Text :=InputB$(LOF(1), 1);<br>不过VB我不熟悉
 
同意 TYZhang <br>StringToWideChar &nbsp;<br>其实在delphi自动转换的<br>比如你定义一个string和Widestring,直接赋就可以了,我做过试验的。
 
還有沒有好點的方法?<br>能不能反ansi文件直接轉成Unicode格式,這樣就很快的!
 
好象不行,一定要把文件load进来以后改变。关注中。[8D]<br>function AnsiToUnicode(Ansi: string):string; <br>var <br>&nbsp; s:string; <br>&nbsp; i:integer; <br>&nbsp; j,k:string[2]; <br>&nbsp; a:array [1..1000] of char; <br>begin <br>&nbsp; s:='';<br>&nbsp; StringToWideChar(Ansi,@(a[1]),500); <br>&nbsp; i:=1; <br>&nbsp; while ((a&lt;&gt;#0) or (a[i+1]&lt;&gt;#0)) do begin <br>&nbsp; &nbsp; j:=IntToHex(Integer(a),2);<br>&nbsp; &nbsp; k:=IntToHex(Integer(a[i+1]),2);<br>&nbsp; &nbsp; s:=s+k+j;<br>&nbsp; &nbsp; i:=i+2;<br>&nbsp; end;<br>&nbsp; &nbsp; Result:=s;<br>end;
 
&gt;&gt;&gt;能不能反ansi文件直接轉成Unicode格式,這樣就很快的! &nbsp;<br>即使所谓的‘直接转换’也避免不了这样的 步骤:<br>&nbsp; &nbsp; 1 磁盘ascii文件读入内存<br>&nbsp; &nbsp; 2 内存中ascii转Unicode<br>&nbsp; &nbsp; 3 内存中Unicode写到磁盘<br>不知道你说的直接转换什么意思?
 
&nbsp; &nbsp;在Delphi放一個TMemo名為TxtBox那麼用TxtBox.Lines.GetText這一句就可以得到所有的內容.這過是PChar類的.那能不能把PChar轉成Unicode?<br><br>&nbsp; &nbsp; 在Delphi的在Help裡有以下三行:<br>&nbsp; &nbsp; A PChar is a pointer to a null-terminated string of 8-bit characters.<br>&nbsp; &nbsp; A PAnsiChar is a pointer to a null-terminated string of 8-bit characters.<br>&nbsp; &nbsp; A PWideChar is a pointer to a null-terminated string of 16-bit characters.<br>&nbsp; &nbsp; <br>&nbsp; &nbsp; 那麼PChar&lt;-&gt;PWideChar這樣相互轉換.轉換成PWideChar後是不是就等是Unicode字符了,如果是的話,那TMemo能用Add語句加入PWideChar嗎,或加入Unicode字符嗎?<br><br>&nbsp; &nbsp; 其實說這麼多,我真正的用意是想統計TMemo裡有幾個字符.不轉為Unicode的話,用lenght算出的數不對.英文字符與中文不一樣.如果隻有英文的話能算對.有中文就不行了.<br>&nbsp; &nbsp; 像上例VB的代碼:TxtBox.Text = StrConv(InputB$(LOF(1), 1), vbUnicode)真的是簡單.VB的完整代碼(就是一個過程,過程是彈出一個打開文件的對話框,選擇一個文本文件後,把文件的內容Load到TxtBox裡,Load的時就轉換了):VB裡用'表示注釋一行就像Delphi裡的//一樣<br><br>Private Sub menuFileOpenText_Click() &nbsp; &nbsp;<br>&nbsp; &nbsp; Dim sLocation As String &nbsp; <br>&nbsp; &nbsp; ' Set CancelError is True<br>&nbsp; &nbsp; ComDlg.CancelError = True<br>&nbsp; &nbsp; On Error GoTo ErrHandler &nbsp; &nbsp; &nbsp; &nbsp;<br>&nbsp; &nbsp; ' Set flags<br>&nbsp; &nbsp; ComDlg.Flags = cdlOFNFileMustExist Or cdlOFNPathMustExist<br>&nbsp; &nbsp; ' Set Dialog title<br>&nbsp; &nbsp; ComDlg.DialogTitle = "Open a Text File"<br>&nbsp; &nbsp; ' Set open directory<br>&nbsp; &nbsp; sLocation = GetDirectory()<br>&nbsp; &nbsp; If Len(sLocation) &lt;&gt; 0 Then<br>&nbsp; &nbsp; &nbsp; &nbsp; ComDlg.InitDir = sLocation<br>&nbsp; &nbsp; End If &nbsp; &nbsp;<br>&nbsp; &nbsp; ' Set filters<br>&nbsp; &nbsp; ComDlg.Filter = "All Files (*.*)|*.*|Text, XML Files " &amp; "(*.txt;*.xml)|*.txt;*.xml" <br>&nbsp; &nbsp; ' Specify default filter<br>&nbsp; &nbsp; ComDlg.FilterIndex = 2<br>&nbsp; &nbsp; ' Display the Open dialog box<br>&nbsp; &nbsp; ComDlg.ShowOpen &nbsp; &nbsp;<br>&nbsp; &nbsp; ' Now open the text file and open it in the text box.<br>&nbsp; &nbsp; ' We only support text files encoded with the system code page as the<br>&nbsp; &nbsp; ' binary to unicode conversion in VB is using system code page.<br>&nbsp; &nbsp; Open ComDlg.FileName For Binary Access Read As 1<br>&nbsp; &nbsp; TxtBox.Text = StrConv(InputB$(LOF(1), 1), vbUnicode)<br>&nbsp; &nbsp; Close #1 &nbsp; &nbsp;<br>&nbsp; &nbsp; Exit Sub &nbsp; &nbsp;<br>ErrHandler:<br>&nbsp; &nbsp; 'User pressed the Cancel button, do not show error<br>&nbsp; &nbsp; If Not (Err.Number = 32755) Then<br>&nbsp; &nbsp; &nbsp; &nbsp; AddDebugInfo "Open file: ", Err.Description<br>&nbsp; &nbsp; End If<br>End Sub<br><br>注在以上代碼中這一句:Open ComDlg.FileName For Binary Access Read As 1好像也很重要哦.是以2進制方式讀文件的.
 
》》那麼PChar&lt;-&gt;PWideChar這樣相互轉換.轉換成PWideChar後是不是就等是Unicode字符了,如果是的話,那TMemo能用Add語句加入PWideChar嗎,或加入Unicode字符嗎?<br><br>是的 转了就是 Unicode字符了 ,但是Tmemo 可能不能接受 Unicode字符,因为实际Tmemo<br>中字符是 Tmemo.text &nbsp;这个域不是Widestring类型的。。。。。<br><br>如果想判断字符串里面有多少个‘字’,有两中方法:<br>1。扫描string,逐个判断每字节。有一个函数:<br>function ByteType(const S: string; Index: Integer): TMbcsByteType;<br>它可以判断一个字符串中,某个 Char 是单个字母,还是双字节的前一位或后一位。<br>mbSingleByte 单字母<br>mbLeadByte 双字节第一位<br>mbTrailByte 双字节第二位<br>我们只要弄一个指针,指向当前字节,如果是汉字往后跳两个,英文跳一个。。。这样数下来就可以了<br><br>第二种方法,很方便,其实你只要直接用赋值语句就可以直接转换。<br>比如 &nbsp;s1:string ; s2:Widestring; &nbsp; 那么 s1:=s2; &nbsp;s2:=s1; &nbsp;都是直接转的!<br>那么 你可以 s2:=Memo.text; showmessage(inttostr(length(s2)));<br>我测试过了,是对的。另外需要注意的是一个回车是两个Ascii符(#13#10)用Unicode表示应该是‘两个字’
 
另外:<br>。。。。。。。。。。。。。。。。。。。。。。。。。<br>ShortString 短字符串类型也就是前面所述的传统 Pascal 字符串类型。这类字符串最多只能有255个字符,与16位Delphi中的字符串相同。短字符串中的每个字符都属于ANSIChar 类型(标准字符类型)。 <br><br>ANSIString长字符串类型就是新增的可变长字符串类型。这类字符串的内存动态分配,引用计数,并使用了更新前拷贝(copy&amp;shy;-on-write)技术。这类字符串长度没有限制(可以存储多达20亿个字符!),其字符类型也是ANSIChar 类型。 <br><br>WideString 长字符串类型与ANSIString 类型相似,只是它基于WideChar 字符类型,WideChar 字符为双字节Unicode 字符。
 
普通unicode<br>var<br>&nbsp; AStr:String;<br>&nbsp; WStr:WideString;<br>.....<br>&nbsp; WStr:=AStr;//直接附值<br><br>到utf-8<br>var<br>&nbsp; AStr:String; &nbsp;<br>&nbsp; UStr:String;<br>......<br>&nbsp; UStr:=AnsiToUtf8(AStr);<br>&nbsp;
 
&nbsp;楼主老大 &nbsp;还有什么问题吗 ?
 
沒有了,我用別的方法做程序了,不過不是很理想,最理想還是Unicode啊.<br>給分!
 
多人接受答案了。
 

Similar threads

回复
0
查看
867
不得闲
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
916
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部