一个汉字占几个字节?(10分)

  • 主题发起人 主题发起人 lcl_003
  • 开始时间 开始时间
你是不是通过计算机发送到某种设备上显示?
如果是的话,可以考虑按每8个像素组成一个byte发送。
我已经三年没用过C(只有做作业才用),
通过Delphi写段程序给你,与C很接近的,你看看
procedure Test;
type
arrChr = array [0..9] of char;
var
str: string;
p: arrChr;
i: integer;
begin
str := '汉字';//初始化发送的数据
for i := 1 to Length(str) do
//赋值,相当于传输数据到数组中,小心越界
begin
//建议按一定的结构发送数据,并送上长度
p[i-1] := str;
end;
p[i-1] := #0;//字符串结束标识符
showmessage(p[0]+p[1]);
showmessage(pchar(@p[0]));
end;
 
哦,是这样的,我拆了汉字发给另外的机器,它只负责存储,不用显示。我需要的时候再
从它那里读回来,在组合一下显示出来,我显示,它不显示只存储,所以应该可以不考虑
乱码的问题。
现在的问题还是我要把汉字拆开以byte类型发给它,因为我发送是调用动态连接库的函数。
在动态连接库了senddata定义的是byte类型。
 
随意改了一下,你看看
procedure TestByte;
type
arrChr = array [0..9] of byte;
var
str: string;
p: arrChr;
i: integer;
begin
str := '汉字';//初始化发送的数据
for i := 1 to Length(str) do
//赋值,相当于传输数据到数组中,小心越界
begin
//建议按一定的结构发送数据,并送上长度
p[i-1] := byte(str);//char->byte,如果是读取回的数据(byte类型),不用转换,可以使用move方法
end;
p[i-1] := $0;//字符串结束标识符
showmessage(char(p[0])+char(p[1]));
showmessage(pchar(@p[0]));
end;
 
拆开应该是没问题的。
 
呵呵,两个字节,不过DELPHI提供了一个WIDESTRING的类型
你只要把 变量声明为WIDESTRING
比如
var
a:WIDESTRING;
begin
a:='英文ABC';
showmessage(inttostr(length(a));
end
显示是 5呵呵,不是7,这个类型能分别汉字的,
用a[1]a[2]a[3]..直接拆。不会出现乱码
 
在unicode16中占2个字节,GB2312中也占两个字节,u32占4个字节,可是支持U32的东西少
 
对于字符串,你完全可以通过数组方式取它的每一个字节发出去,接收回来后再按顺序组成一个字符串,不会造成乱码,哪怕是发出去后又从那里接收回来显示.
比如汉字"字"
发送:
var s:String;
b:Byte;
begin
s:='字';
b:=ORD(s[1]);
//
这里写代码发送第一个字节.
//
b:=ORD(s[2]);
//
这里写代码发送第二个字节.
//
end;

接收:
var s:String;
b:Byte;
begin
s:='';
//
这里写代码接收第一个字节.
接到后存放在b中.
//
s:=s+Chr(b);
//
这里写代码接收第二个字节.
接到后存放在b中.
//
s:=s+Chr(b);
这里组合成的字符串显示出来就"字"字.
end;
 
一个汉字占两个字节,全角的标点会占两个字节呢!所以要省点用哦!
 
请换一种思路,你用一个提取内码的小函数直接发送4位数字的汉字内码,
那边的也存储内码,再做一个内码显示小函数,OK
 
aizb, 我查了下资料说ord是返回序数类序数,但是是啥意思不太清楚,给说说?
 
不会把!这么一个问题怎么这么多的人回答呀?真是太热闹了,真好![:D]
 
aizb, 你的代码有问题啊,在接收部分
s:=s+Chr(b);
而chr返回的是char型字符,s是string型的,不匹配啊,我编译不过去:(
string和char不能相互付值吗?
 
[yellow][/yellow]
一个汉字占 2 个字节。[:)]
 
和编码有关,如果用UTF-8的话是3个字节吧
 
接受答案了.
 
后退
顶部