如何把一个汉字转化为ascii码(30分)

  • 主题发起人 主题发起人 airpor
  • 开始时间 开始时间
命題錯誤. ascii是單字節編碼(只用了7位),0--127
漢字Big5編碼或gb2312編碼是兩字節編碼,而utf8是三字節編碼,所以漢字是無法轉化為ascii編碼的.
 
汉字在计算机中的表示与普通字符不同。GB编码中每一个汉字用两个字节表示,每个字节的高位为1,即汉字的ASCII码是从128到255;Unicode编码中所有字符均用4位字节表示。
要将汉字的ASCII码取出来,可以将每个字节的ASCII码取出来,系统会根据高位状态自动判断是否为汉字。
 
或者这样说,如何把一个汉字取道两个asii字符数组中
 
可以放到兩個字節中,但無法實現"取道两个asii字符数组中",因為Ascii字符首位是'0'.
var Str:string='ABCDE人民';
如果你這樣定義,那麼,'ABCDE'幾個字符各佔一個字節,'人'佔兩個字節,'民'佔兩個字節.
var Str:WideString='ABCDE人民';
如果你這樣定義,那麼,'A','B','C','D','E','人','民'各佔兩個字節.
 
另外,告訴你如何判斷某個字節是Ascii碼還是漢字首字節還是尾字節.
var
S:String;
begin
S:='人';
case ByteType(S,1) of //判斷第一個字節是什麼類型.
mbSingleByte://單字節字符.即ascii碼
mbLeadByte: //漢字首字節
mbTrailByte //漢字末字節
end;
 
一个汉字为两个字节,所以只有半个字节才能转,
 
var
S: string;
tmpStr:widestring;
i:integer;
begin
tmpStr:='abc你好';
S:= tmpStr+'---';
for i:=1 to Length(tmpStr) do
S :=S+ IntToStr(Ord(tmpStr)) + ' ';
MessageDlg(S, mtInformation, [mbOk], 0);
end;
 
function TForm1.GetW(Text:string): string;
var
buff1,buff2:byte;
begin
with TMemoryStream.Create do
begin
Write(Text[1],Length(Text));
Position:=0;
Read(buff1,SizeOf(byte));
Read(buff2,SizeOf(byte));
Free;
end;
Result:=IntToHex(Ord(buff1),2)+IntToHex(Ord(buff2),2);
end;

在一个 EDIT 里输入汉字,结果送入 MEMO 测试:
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Lines.Add(GetW(Edit1.Text));
end;
 
多谢,我知道答案了,现在把原问题拿出来请教大家:
从sysbase数据库把数据倒入oracle数据库,结果在倒入过程中,他把汉字截断了,结果有的汉字只有一个字节,我们在前台调用weblogic中间件取数据的过程中,如果碰到这种字符(资料表明weblogic不支持这种字符),就会一直去调服务,导致oracle服务器当掉,现在想把这些字符用delphi全部扫描一遍,改成正常字符。
 
你说的 2 种库我都不懂,sysbase 中原始的数据是否有完整的汉字?从这个库取数的过程
是否可以由我们添加代码,比如,我在从 sysbase 取 TEXT 格式的数据时,加入某种编码,
转到 oracle 去前,解码并提供 oracle 需要的 TEXT 格式。如果可以的话,就太简单了。
不知道 weblogic 对储存在 oracle 里的正确的汉字是否能够支持?
 
Sybase数据库中就是不完整的字符,weblogic是一种应用服务器,数据已经倒进来了:
从sybase那边做一个截取是可以的;

现在问题解决了:trim函数,可以截断不完整的字符
多谢大家
 
ByteType(Const S:string;Index:integer) = mbSingleByte // 是英文字母
= mbLeadByte // 是双字节汉字的第一位
= mbTraiByte // 是双字节汉字的第二位
CASE ByteType('汉',1) of
mbSingleByte: ShowMessage('是英文字母');
mbLeadByte: ShowMessage('是双字节汉字的第一位');
mbTraiByte: ShowMessage('是双字节汉字的第二位');
end;//case
 
后退
顶部