在Lazarus中如何将指定编码转换为№字符(支持变量处理)
在Lazarus中处理多字节UTF-8字符的变量转换
1. 变量方式生成'№'字符的正确方法
已知'№'的UTF-8编码对应三个字节:0xE2、0x84、0x96,要通过变量生成该字符,不要用chr()拼接(会破坏UTF-8编码结构),直接将字节数组转换为UTF-8字符串即可:
方法一:使用SetString函数
var Bytes: array[0..2] of Byte = ($E2, $84, $96); S: string; begin SetString(S, PChar(@Bytes[0]), Length(Bytes)); Edit3.Caption := S; end;
方法二:直接强制转换字节数组(FPC 3.0+适用)
FPC默认string为UTF-8编码,可直接将字节数组转换为字符串:
var Bytes: array[0..2] of Byte = ($E2, $84, $96); begin Edit3.Caption := string(PChar(@Bytes[0])); end;
2. 为什么chr(r1)+chr(r2)+chr(r3)会出现乱码
chr()函数默认返回单字节Ansi字符,拼接后得到的是Ansi字符串,而非UTF-8编码串。UTF-8的多字节编码是一个整体单元,拆分单个字节用chr()拼接,会被系统当成独立的Ansi字符解析,自然出现意外符号。
双字节字符(如'Р')能正常显示只是巧合:若系统默认Ansi编码恰好与该字符的UTF-8双字节编码兼容,才会显示正确,但这是不可靠的非跨平台做法。
通用处理原则
- 始终将多字节序列作为整体转换为UTF-8字符串,不要拆分单个字节用
chr()拼接 - Lazarus/FPC中默认
string为UTF-8编码,转换后的字符串可直接赋值给控件Caption属性
内容的提问来源于stack exchange,提问作者Kirill Palagin
相关产品推荐
相关产品推荐

