导读:
Delphi中WideString与String的区别
2006-05-21 20:24:00 / 个人分类:编程技巧
有谁能说出这两个类型的区别吗?后来大脚兄解释说:WideString 以两位方式处理字符串,而String 则一位一位处理。不过,这意味着什么呢?
如果你只开发英文版的软件,那无所谓,这两个类型没有任何区别。但是如果使用了中文,那就要严格区分这两个类型的区别了,否则就像我前几天那样,为了乱码的问题百思不得其解。
聪明一点的朋友会说:我知道它们的区别,所以凡是用到中文的地方我全都用WideString 。一开始我也是这么认为的,但其实这种观点恰恰可能会产生乱码哦。(不过不是非常严重的乱码,一般出现在字符串的末尾)
在Delphi 的定义单元中有个函数,叫UTF8Encode ,定义是这么写的:
function Utf8Encode(const WS: WideString): UTF8String;
...
注意这个函数的参数写的类型是WideString ,不知道这算不算一个BUG ,我就是按照了它的定义使用了WideString 类型才出现了乱码。当我把参数类型换成String 后一切都正常了,这是为什么呢?
后来仔细研究了一下UTF8Encode 的函数体,处理过程中又转向了Utf8ToUnicode 函数。原来它需要逐字节处理的。就是说无论是双字节的中文还是单字节的拉丁文,它全都把它看作机器码(什么乱七八糟的数字我也不管了,反正机器明白就行了),然后根据这些代码进行转换。而如果输入参数采用了双字节的WideString ,虽然中间还是可以保持正常处理,但是最后一个字就会处理不好了,所以就产生了乱码。
所以,我认为UTF8Encode 的参数只能是String 类型,而不能是WideString 类型。否则就失去了这个函数的意义了,出来后还是乱码,呵呵。跟我一样的朋友注意了哦。
本文转自
http://hi.baidu.com/xingfupingguo/blog/item/e887a2fde604a246d6887d37.html
Delphi中WideString与String的区别
2006-05-21 20:24:00 / 个人分类:编程技巧
有谁能说出这两个类型的区别吗?后来大脚兄解释说:WideString 以两位方式处理字符串,而String 则一位一位处理。不过,这意味着什么呢?
如果你只开发英文版的软件,那无所谓,这两个类型没有任何区别。但是如果使用了中文,那就要严格区分这两个类型的区别了,否则就像我前几天那样,为了乱码的问题百思不得其解。
聪明一点的朋友会说:我知道它们的区别,所以凡是用到中文的地方我全都用WideString 。一开始我也是这么认为的,但其实这种观点恰恰可能会产生乱码哦。(不过不是非常严重的乱码,一般出现在字符串的末尾)
在Delphi 的定义单元中有个函数,叫UTF8Encode ,定义是这么写的:
function Utf8Encode(const WS: WideString): UTF8String;
...
注意这个函数的参数写的类型是WideString ,不知道这算不算一个BUG ,我就是按照了它的定义使用了WideString 类型才出现了乱码。当我把参数类型换成String 后一切都正常了,这是为什么呢?
后来仔细研究了一下UTF8Encode 的函数体,处理过程中又转向了Utf8ToUnicode 函数。原来它需要逐字节处理的。就是说无论是双字节的中文还是单字节的拉丁文,它全都把它看作机器码(什么乱七八糟的数字我也不管了,反正机器明白就行了),然后根据这些代码进行转换。而如果输入参数采用了双字节的WideString ,虽然中间还是可以保持正常处理,但是最后一个字就会处理不好了,所以就产生了乱码。
所以,我认为UTF8Encode 的参数只能是String 类型,而不能是WideString 类型。否则就失去了这个函数的意义了,出来后还是乱码,呵呵。跟我一样的朋友注意了哦。
本文转自
http://hi.baidu.com/xingfupingguo/blog/item/e887a2fde604a246d6887d37.html