[求解]关于Unicode,送上150分 ( 积分: 150 )

  • 主题发起人 主题发起人 ooiioo
  • 开始时间 开始时间
O

ooiioo

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在有一个以Unicode编码的文件,用Unicode编码打开看是日文的.<br>我想把它一行一行的读出来(必须一行一行的读,还要做其他处理).<br>用的是读文本文件的readln函数,读出的字符串的乱码.<br>请教高手,如何读出Unicode字符串!<br>
 
我现在有一个以Unicode编码的文件,用Unicode编码打开看是日文的.<br>我想把它一行一行的读出来(必须一行一行的读,还要做其他处理).<br>用的是读文本文件的readln函数,读出的字符串的乱码.<br>请教高手,如何读出Unicode字符串!<br>
 
用fileread读,用二进制方式打开
 
我还需要将Unicode字符串显示输出,用二进制打开后怎样转换成字符呢?
 
var<br> &nbsp;F: TextFile;<br> &nbsp;S: string;<br> &nbsp;P: PWideChar;<br>begin<br> &nbsp;AssignFile(F, 'test.txt');<br> &nbsp;try<br> &nbsp; &nbsp;Reset(F);<br> &nbsp; &nbsp;Readln(F, S);<br> &nbsp; &nbsp;P := Pointer(S);<br> &nbsp; &nbsp;Label1.Caption := WideString(P); // 字体设为日文字体(如 Name=MS Mincho, charset=SHIFT_JIS)<br> &nbsp;finally<br> &nbsp; &nbsp;CloseFile(F);<br> &nbsp;end;<br>end;<br>
 
很久没用unicode了,但记得unicode的读写应该使用widestring,所以你只要使用widestring相关的函数,应该就没问题。具体函数自己查查帮助
 
to yanghai0437:<br>这个“// 字体设为日文字体(如 Name=MS Mincho, charset=SHIFT_JIS)”需要加到程序中么?<br>文件中可能还有别国文字的,不一定是日文。
 
不使用正确的字体(主要是字符集charset)显示不同语言的文字,很有可能是乱码的,当然日文、中文中有些相近的字的Unicode编码实际上相同的,这些是可以正常显示的。
 
字符集里没有的会显示为乱码。
 
这个资料你看看对你有没有用吧<br>1. Uuencode<br> &nbsp; &nbsp;Uuencode 是将二进制文件以文本文件方式进行编码表示、<br>以利于基于文本传输环境中进行二进制文件的传输/交换的编<br>码方法之一, 在邮件系统/二进制新闻组中使用频率比较高,<br>经常用于 Attach 二进制文件。<br> &nbsp; &nbsp;这种编码的特征是:每一行开头用“M”标志。下面是我<br>做的一个测试用的文件mogao.txt,编码为Uuencode:<br>begin 644 mogao.txt<br>M&quot;0D)(&quot;`@(*&amp;VPM+&quot;Z/OCMZBT//BKH;&amp;lt;-&quot;@G7]]7?.FUO9V%OHZRPU]3&amp;N/:Z<br>MU]6^HZAT96QN970Z+R/R,#(N,3$R+C(P+C$S,CHR,Z.IL/G4L:&amp;C#0H)(&quot;`@<br>M(&quot;`@Q*JXW/CMO/ZYI-?WRM*CNFAT='`Z+R]M;V=A;RYB96YT:75N+FYE=`T*<br>M&quot;0D)16UA:6QT;SIM;V=A;T`S-S$N;F5T#0H)(&quot;`@*BHJ*BHJ*BHJ*BHJ*BHJ<br>M*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ(&quot;`@(&quot;`@(&quot;`@(&quot;`@(&quot;`@<br>M#0H)(&quot;`@*B&quot;S_&amp;lt;'+O,?2Y,JRP[2VO+*[M/C7WZ.LL_W!R]?CO*/*LL.TMKRR<br>MN/'TS/(J#0H)(&quot;`@*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ<br>,*BHJ*BHJ*BHJ*BHJ<br>`<br>end<br> &nbsp; &nbsp;你可以把它单独存成一个文件:mogao.uue,然后用Winzip<br>打开,解压即得mogao.txt。<br> &nbsp; &nbsp;Uuencode的算法很简单,编码时它将3个字符顺序放入一个<br> 24 位的缓冲区,缺字符的地方补零,然后将缓冲区截断成为<br>4 个部分,高位在先,每个部分 6 位,用下面的64个字符重新<br>表示:<br>&quot;`!&quot;#$%&amp;'()*+,-./0123456789:;&amp;lt;=&amp;gt;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[/]^_&quot;<br>在文件的开头有“begin xxx 被编码的文件名”,在文件的结尾<br>有“end”,用来标志Uue文件的开始和结束。编码时,每次读取<br>源文件的45个字符,不足45个的用“NULL”补足为3的整数倍(<br>如:23补为24),然后输入目标文件一个ASCII为:“32+实际<br>读取的字符数”的字符作为每一行的开始。读取的字符编码后<br>输入目标文件,再输入一个“换行符”。如果源文件被编码完<br>了,那么输入“`(ASCII为96)”和一个“换行符”表示编码<br>结束。<br> &nbsp; &nbsp;解码时它将4个字符分别转换为4个6位字符后,截取有用的<br>后六位放入一个 24 位的缓冲区,即得3个二进制代码。<br> &nbsp; &nbsp;下面我给出Uuencode编码和解码的C语言描述:<br>/*Uuencode编码*/<br>void Uue(unsigned char chasc[3],unsigned char chuue[4])<br>/*<br>chasc:未编码的二进制代码<br>chuue:编码过的Uue代码<br>*/<br>{int i,k=2;<br> unsigned char t=NULL;<br> for(i=0;i&amp;lt;3;i++)<br> {*(chuue+i)=*(chasc+i)&amp;gt;&amp;gt;k;<br> &nbsp;*(chuue+i)|=t;<br> &nbsp;if(*(chuue+i)==NULL) *(chuue+i)+=96;<br> &nbsp;else *(chuue+i)+=32;<br> &nbsp;t=*(chasc+i)&amp;lt;&amp;lt;(8-k);<br> &nbsp;t&amp;gt;&amp;gt;=2;<br> &nbsp;k+=2;<br> }<br> *(chuue+3)=*(chasc+2)&amp;63;<br> if(*(chuue+3)==NULL) *(chuue+3)+=96;<br> else *(chuue+3)+=32;<br>}<br>/*Uuencode解码*/<br>void unUue(unsigned char chuue[4],unsigned char chasc[3])<br>/*<br>chuue:未解码的Uue代码<br>chasc:解码过的二进制代码<br>*/<br>{int i,k=2;<br> unsigned char t=NULL;<br> if(*chuue==96) *chuue=NULL;<br> else *chuue-=32;<br> for(i=0;i&amp;lt;3;i++)<br> {*(chasc+i)=*(chuue+i)&amp;lt;&amp;lt;k;<br> &nbsp;k+=2;<br> &nbsp;if(*(chuue+i+1)==96) *(chuue+i+1)=NULL;<br> &nbsp;else *(chuue+i+1)-=32;<br> &nbsp;t=*(chuue+i+1)&amp;gt;&amp;gt;8-k;<br> &nbsp;*(chasc+i)|=t;<br> }<br>}<br>2. Xxencode<br> &nbsp; &nbsp;提到Uuencode不可能不提Xxencode, Xxencode的编码算法<br>和 Uuencode基本相同,但是使用的是不同的字符集。XxEncode<br>编码使用的字符是:<br>“+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz”<br>与 Uuencode 相比,它的特殊字符更少。很多支持 Uuencode<br>编解码的工具都同时支持 Xxencode。<br> &nbsp; &nbsp;这种编码的特征是:每一行开头用“h”标志。下面是<br>Xxencode的一个例子:<br>begin 644 mogao.txt<br>h0EY760+U684qkh90uwjXhuWowwWfcPQB0UbLxxLTCapjNq3jcumkpxH4iwOu<br>hpxKycuVoNKliNLEu9mwmA16iAH2m9X6k9X2nAXcmAuCdgwbIgO4X1Ec760+U<br>h60+Ul8esrwXhjDutdBTrmh8XiaVoR5+u9mxhPqRVPmtWNKtoOLJi9atZR+o8<br>h0EY7FKpVOKloPndhPqRVPo+nBn2iPaJo1Ec760+U8Wce8Wce8Wce8Wce8Wce<br>h8Wce8Wce8Wce8Wce8Wce8Wce8Wce8Wce8Wce8Wce60+U60+U60+U60+U60+U<br>h1Ec760+U8W0nzQ59jATGtAemkvGqj98vhDXLruCggzr-mxTXj8D8ggCohfmm<br>hiw5onw6e1Ec760+U8Wce8Wce8Wce8Wce8Wce8Wce8Wce8Wce8Wce8Wce8Wce<br>A8Wce8Wce8Wce8Wce<br>+<br>end<br> &nbsp; &nbsp;你可以把它单独存成一个文件:mogao.xxe,然后用Winzip<br>打开,解压即得mogao.txt。<br> &nbsp; &nbsp;Xxencode的编码算法和Uuencode基本相同,实现起来则更<br>为简单,在此就不详述了。<br> &nbsp; &nbsp;下面给出Xxencode编码和解码的C语言描述:<br>/*Xxencode编码*/<br> void Xxe(unsigned char chasc[3],unsigned char chxxe[4])<br>/*<br>chasc:未编码的二进制代码<br>chxxe:编码过的Xxe代码<br>*/<br>{int i;<br> static char set[]=<br> &nbsp;&quot;+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz&quot;;<br> chxxe[0]=chasc[0]&amp;gt;&amp;gt;2;<br> chxxe[1]=(chasc[0]&amp;lt;&amp;lt;4)&amp;48|(chasc[1]&amp;gt;&amp;gt;4)&amp;15;<br> chxxe[2]=(chasc[1]&amp;lt;&amp;lt;2)&amp;60|(chasc[2]&amp;gt;&amp;gt;6)&amp;3;<br> chxxe[3]=chasc[2]&amp;63;<br> for(i=0;i&amp;lt;4;i++) chxxe=set[chxxe]; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /*查表*/<br>}<br>/*需注意的是,Xxencode文件正文部分中每一行的第一个字母是<br>:从源文件中实际读取的字符数的ASCII值取后六位后用set[]查<br>表得到的。*/<br>/*Xxencode解码*/<br>unsigned char set(unsigned char ch) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /*查表函数*/<br>{if(ch==43) ch=0;<br> else if(ch==45) ch=1;<br> else if(ch&amp;gt;=48&amp;&amp;ch&amp;lt;=57) ch-=46;<br> else if(ch&amp;gt;=65&amp;&amp;ch&amp;lt;=90) ch-=53;<br> else if(ch&amp;gt;=97&amp;&amp;ch&amp;lt;=122) ch-=59;<br> return ch;<br>}<br>void unXxe(unsigned char chxxe[4],unsigned char chasc[3])<br>/*<br>chxxe:未解码的Xxe代码<br>chasc:解码过的二进制代码<br>*/<br>{int k=2 ,i;<br> unsigned char t;<br> t=NULL;<br> *chxxe=set(*chxxe);<br> for(i=0;i&amp;lt;3;i++)<br> {*(chxxe+i+1)=set(*(chxxe+i+1));<br> &nbsp;(chhex+i)=*(chxxe+i)&amp;lt;&amp;lt;k;<br> &nbsp;k+=2;<br> &nbsp;t=*(chxxe+i+1)&amp;gt;&amp;gt;8-k;<br> &nbsp;*(chhex+i)|=t;<br> }<br>}<br><br>
 
function GetFileText(const FileName: string): string;<br>var<br> &nbsp;hFile: DWORD;<br> &nbsp;iSize: DWORD;<br> &nbsp;sTemp: string;<br>begin<br> &nbsp;hFile := CreateFile(PChar(FileName), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);<br> &nbsp;iSize := GetFileSize(hFile, nil);<br> &nbsp;SetLength(sTemp, iSize + 2);<br> &nbsp;ReadFile(hFile, sTemp[1], iSize, iSize, nil);<br> &nbsp;CloseHandle(hFile);<br> &nbsp;sTemp[iSize + 1] := #0;<br> &nbsp;sTemp[iSize + 2] := #0;<br> &nbsp;if (sTemp[1] = #$FF) and (sTemp[2] = #$FE) then // UNICODE<br> &nbsp;begin<br> &nbsp; &nbsp;SetLength(Result, iSize);<br> &nbsp; &nbsp;WideCharToMultiByte(CP_ACP, 0, PWideChar(@sTemp[3]), -1, @Result[1], iSize, nil, nil);<br> &nbsp;end else<br> &nbsp; &nbsp;Result := sTemp;<br> &nbsp;Result := string(PChar(Result));<br>end; <br>用这个函数取出并转换,而所谓一行行读无非就是定位#13#10.
 

Similar threads

后退
顶部