【问题标题】:Delphi: Convert from windows-1251 to Shift-JISDelphi:从 windows-1251 转换为 Shift-JIS
【发布时间】: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 分钟思考一下。

标签: windows delphi delphi-xe


【解决方案1】:

您所看到的是正确的,而不是您所期望的。例如,%6Cl 的 ascii 表示。所以你可以尝试这样的事情:

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
      if (b in [65..90]) or (b in [97..122]) then
      begin
        sb.Append( char(b)); // normal ascii
      end  
      else
      begin
        sb.Append('%');
        sb.Append(IntToHex(b, 2));
      end;
    end;
    Result := sb.ToString;
  finally
    sb.Free;
  end;
end;

或者你可以保持原样!

【讨论】:

  • @DavidHeffernan,感谢您抽出宝贵时间阅读我的问题。
  • 既然您已经了解了接受,您可能还想查看您的其他问题。您不必接受答案。如果您觉得没有任何答案能解决问题,请不要接受。 meta.stackexchange.com/questions/5234/…
  • 在 URL 编码中,ANY 八位字节可以是十六进制编码,无论其值如何。接收器需要对它们进行同等解码。所以原始代码非常好。但是,如果您要从编码中过滤掉“安全”八位字节,请考虑在该范围内包含48..57 ('0'..'9')。还有一些其他 ASCII 字符也是“安全的”并且不需要编码('-''.''_''~')。有关详细信息,请参阅RFC 3986 section 2
  • @RemyLebeau 这就是为什么我说'或者你可以保持原样'
猜你喜欢
  • 1970-01-01
  • 2022-07-01
  • 2021-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-06
  • 2014-05-02
相关资源
最近更新 更多