string - 将多字节十六进制转换回 UTF-8 字符串
问题描述
解决方案
我没有迹象表明它是 4 个字符长的欧元符号,而不是 2 个字符
仅由于这个原因,您根本无法转换"61626320AC"
回"abc€"
,因为您不知道哪些十六进制代码是 2 位数字,哪些是 4 位数字,您没有区分它们。例如,十六进制代码6162
也6263
代表有效的 Unicode 字符。
正如评论中提到的@TomBrunberg,您可以为每个字符使用 4 位十六进制代码,例如:
function TForm1.Button2Click(Sender: TObject);
var
i, nr : integer;
Input, HexStr, h: String;
begin
HexStr := '';
Input := Edit2.Text;
for i := Low(Input) to High(Input) do begin
nr := Ord(Input[i]);
h := IntToHex(nr, 4);
HexStr := HexStr + h;
end;
Edit3.Text := HexStr;
end;
然后,您可以在调用时通过将十六进制字符串拆分为 4 个字符组来转换回来StrToInt()
,例如:
function TForm1.Button3Click(Sender: TObject);
var
i, nr : integer;
Output, HexStr, h: String;
begin
HexStr := Edit3.Text;
Output := '';
i := Low(HexStr);
while i <= High(HexStr) do begin
h := Copy(HexStr, i, 4);
nr := StrToInt('$' + h);
Output := Output + Char(nr);
Inc(i, 4);
end;
Edit2.Text := Output;
end;
或者,正如@AmigoJack 所暗示的,您可以改用 UTF-8,例如:
function TForm1.Button2Click(Sender: TObject);
var
i, nr : integer;
HexStr, h: String;
Input: UTF8String;
begin
HexStr := '';
Input := UTF8String(Edit2.Text);
for i := Low(Input) to High(Input) do begin
nr := Ord(Input[i]);
h := IntToHex(nr, 2);
HexStr := HexStr + h;
end;
Edit3.Text := HexStr;
end;
function TForm1.Button3Click(Sender: TObject);
var
i, nr : integer;
HexStr, h: String;
Output: UTF8String;
begin
HexStr := Edit3.Text;
Output := '';
i := Low(HexStr);
while i <= High(HexStr) do begin
h := Copy(HexStr, i, 2);
nr := StrToInt('$' + h);
Output := Output + AnsiChar(nr);
Inc(i, 2);
end;
Edit2.Text := string(Output);
end;
推荐阅读
- go - Gazelle 没有创建正确的依赖关系?
- csound - 使用 CSound 修改音频文件
- android-studio - 我如何在 Android Studio 中构建旧的 Android 项目
- xamarin.forms - 编辑后弹出 RG 插件没有更新属性
- mysql - MySQL query not giving results as expected
- node.js - 节点 js express-session Set-Cookie on Postman/ 不在 Flutter http 标头中
- r - 假设这些都是均匀分布的,如何从下边界和上边界模拟 R 中的值?
- algorithm - 如何找到在单个字典单词中剪切句子的方法总数
- curl - GraphQL 没有为变量提供值
- amazon-web-services - 如何在 AWS Amplify 上更改这些文本?