【发布时间】:2017-07-21 21:25:05
【问题描述】:
我有一个字符串'MIROKU'。我想将此字符串转换为'%82l%82h%82q%82n%82j%82t'。以下是我用于转换的当前函数:
function MyEncode(const S: string; const CodePage: Integer): string;
var
Encoding: TEncoding;
Bytes: TBytes;
b: Byte;
sb: TStringBuilder;
begin
Encoding := TEncoding.GetEncoding(CodePage);
try
Bytes := Encoding.GetBytes(S);
finally
Encoding.Free;
end;
sb := TStringBuilder.Create;
try
for b in Bytes do begin
sb.Append('%');
sb.Append(IntToHex(b, 2));
end;
Result := sb.ToString;
finally
sb.Free;
end;
end;
MyEncode('MIROKU', 932) 返回'%82%6C%82%68%82%71%82%6E%82%6A%82%74'。我不期待这个结果。我期待'%82l%82h%82q%82n%82j%82t'。有什么函数可以正确转换吗?
【问题讨论】:
-
我想把这个字符串 'MIROKU' 转换成 '%82l%82h%82q%82n%82j%82t'。
-
你的函数会产生什么?请改进(编辑)您的问题。你没有说你为
CodePage参数传递了什么,你没有说你从函数中得到了什么以及为什么错了。 -
仍然没有问任何问题。但我想知道为什么你会期望 2 位十六进制字符串可能是 3 位长。试着阅读你自己的代码,想想你写了什么。
-
"MIROKU" 完全由 Unicode 字符组成。这些在 Win1251 和 Shift-JIS 中都无法表示...
-
现在我们有一个问题。那挺好的。但是你现在能解释一下为什么你期望
IntToHex(b, 2)给出你期望的结果吗?例如,它怎么会返回82q?那是三个字符而不是 2,最后一个不是十六进制数字。您需要停止要求我们解决您的问题,并退一步弄清楚您的问题到底是什么。你正在超越自己。在您清楚地了解问题域之前,尝试解决任何问题都是没有意义的。请您花 10 分钟思考一下。