博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于 字符串的 存储和编码转换
阅读量:6341 次
发布时间:2019-06-22

本文共 1443 字,大约阅读时间需要 4 分钟。

http://www.2pascal.com/forum.php?mod=viewthread&tid=2621&fromuid=4

 

 

字符串 在 DELPHI 的移动版本中,只存在 string 这一种类型。

string 的编码是 unicode ,也就是过去的 WideString ,虽然官方说两者不天一样。其实效果是一样的。
但是字符串保存在内存中,或者保存在 文件中,不一定使用这个 unicode 编码。
特别是 记事本的默认保存。
你们可自己用记事本 另存为的 功能 来看看, 记事本提供了几种 文本的编码格式。
当选择非 ANSI 格式的时候。被保存的数据中,最前面会出现 BOM 这种数据。 不懂的去百度。
地球上所有的 正规 文本读写工具,都支持 BOM 。例如 记事本 新版本 DELPHI 以及 TStringList TMemo.Items  TInifile 等。
但是也有一些工具 不支持 BOM。比如一些老外的开发工具,他们要求必须是 UTF8 编码,但是不能存在 BOM。
文本文件用 文件流 或内存流加载成流之后,和保存在文件中,没有任何区别。都是数据。
数据 是不考虑编码的。
数据 也不一定就是字符串。
当你 把一个 非 unicode 编码的字符串数据,强加给 string ,就会出现乱码。
但是,如果你将 数据先转码成 unicode 就不会出现 乱码了。
乱码 是 显示的时候,才能发现的问题。
如何 转码呢?
如果你使用  TStringList 来加载 文本文件,而且,文件文件包含正确的 BOM,那么就会自动转码。
如果你知道文件没有 BOM 也知道正确编码,那么你 加载的时候,通过参数使用  TEnCoding.XXXX 来指定 编码。
List.LoadFromFile('c:/tmp.txt', TEncoding.XXXX); 
还有很多类支持这样的代码。
对于网络传输,很多时候,不可能包含 BOM。
但是,又需要你转码。
那么 传输的对象,请使用 TByes 来保存。
例如
服务器要求你传输 UTF8 的一个字符串。
那么你可以
var
Data: TBytes;
begin
  Data := TEncoding.UTF8.GetBytes('你的字符串');
  Send(Data);
end;
当你收到一个 无 BOM 编码的数据,但是你知道编码,也可以用 TEncoding.XXXX.GetString(收到的TBytes); 来获取。
对于内存流,如果流内有 BOM,可以直接用 TStringList 来加载。
没有 BOM,但是你知道编码,可以 加载的时候,加 TEncoding 参数。 List.LoadFromStream(ms, TEncoding.XXXX); 
对于  indy 类控件。
需要使用  TIdBytes 和 IIdTextEncoding。
IIdTextEncoding 可以通过 IndyTextEncoding(TEncoding) 来转。
在任何情况下,都禁止用 XXXXToYYYY、UTF8Encode 和 UTF8Decode 这些旧的函数。因为全都不如 TEncodiing.编码.函数 这种准确。
使用 TEcnding 的时候,一定要指定编码,否则跨平台会效果不一致。

转载于:https://www.cnblogs.com/stroll/p/8568288.html

你可能感兴趣的文章
python之基本数据类型及深浅拷贝
查看>>
将bootstrap弹出框的点击弹出改为鼠标移入弹出
查看>>
SKF密码设备研究
查看>>
数据对象映射模式(通过工厂模式和注册树模式)v2
查看>>
4939 欧拉函数[一中数论随堂练]
查看>>
MySQL笔记(一)
查看>>
spring boot 包jar运行
查看>>
通过VMWare安装Linux(Ubuntu) 虚拟机在Window10系统和问题解决方案
查看>>
18年秋季学习总结
查看>>
Effective前端1:能使用html/css解决的问题就不要使用JS
查看>>
网络攻防 实验一
查看>>
由莫名其妙的错误开始---浅谈jquery的dom节点创建
查看>>
磨刀-CodeWarrior11生成的Makefile解析
查看>>
String StringBuffer StringBuilder对比
查看>>
.NET与C#
查看>>
在uwp仿制WPF的Window
查看>>
bootstrap随笔点击增加
查看>>
oracle 中proc和oci操作对缓存不同处理
查看>>
[LeetCode] Spiral Matrix 解题报告
查看>>
60906磁悬浮动力系统应用研究与模型搭建
查看>>