【问题标题】:making a base64 decoded text visible without changing "windows language for non unicode program settings" "在不更改“非 unicode 程序设置的 windows 语言”的情况下使 base64 解码文本可见
【发布时间】:2012-02-17 13:07:48
【问题描述】:

我使用 base64 编码工具(如 Indy 工具)在 TMemo 中编码了一个文本,但在解码结果文本后,我只得到一些“?”字符而不是正确的文本。 原文为波斯语。

问题是:

如果我将 windows“非 unicode 程序的语言”设置为波斯语,我可以看到解码后的文本。但我想让解码后的文本可见而不改变“windows non unicode ...”。

它大约两个星期我坚持这个!我试过 "UTF8ToWideString" , "UTF8ToUTF16","UTF8ToUnicodeString","UTF8ToString","UTF8Decode" 和 "UTF8EncodeToShortString" ,但没有一个起作用。

编码 >

  var input,output:TstringStream;
    begin
    input:=nil;
    output:=nil;
    input:=TstringStream.Create;
    output:=TstringStream.Create;
    memo1.Lines.SaveToStream(input);

    input.Position:=0;
    encoder.Encode(input,output);
    output.Position:=0;
    memo2.Clear;
    memo2.Lines.LoadFromStream(output);
    input.Free;
    output.Free
    end; 

解码>>

var input,output:TStringStream;
  begin
  memo3.Clear;
  input:=nil;
  output:=nil;
  input:=TStringStream.Create();
  output:=TStringStream.Create();
  memo2.Lines.SaveToStream(input);
  input.Position:=0;
  decoder.DecodeBegin(output);
  decoder.Decode(input);
  decoder.DecodeEnd;
  output.Position:=0 ;
  memo3.Lines.Add(output.DataString);
   end;

我也试过delphi内部编码工具。如下

// encoding >
memo2.Lines.Add(EncodeString(memo1.Lines.Text))
// decoding>

 memo3.lines.add(DecodeString(memo2.Lines.Text)) ;

【问题讨论】:

  • 也许你的base64编码工具无法处理原始的unicode,问题出在编码而不是解码上。尝试在 Tmemo 中只添加一个字符(问题字符之一),然后查看生成的 base64 字符串有多长。 16 位足够长,还是只有 8 位?
  • 我认为编码器没有故障。因为我同时使用了 delphi 内部编码工具(EncdDecd 单元)和 IdEncode/DecodeerMime。
  • 我试过你说的。我对这些东西不太了解,所以不能说生成的 sring 是 8 位还是 16 位。如果我只编码一个字符,我会得到这个 > Pw== .
  • 2 '=' 表示 4 个字符将解码为单个字节。请参阅en.wikipedia.org/wiki/Base64#Decoding_Base64_with_padding 这证明信息在编码之前或期间丢失。
  • 非常感谢。但是你有什么想法来解决这个问题?!

标签: delphi delphi-xe delphi-xe2


【解决方案1】:

试试这样的:

memo2.Text := TIdEncoderMIME.EncodeString(memo1.Text, IndyUTF8Encoding);

memo3.Text := TIdEncoderMIME.DecodeString(memo2.Text, IndyUTF8Encoding);

【讨论】:

  • 我收到一条错误消息:IndyUTF8Encoding in an undeclared identifier 。
  • 非常感谢 TidtextEncoding 也未声明,但我使用了 TEncoding.utf8 并且“成功了”!!!
  • TIdTextEncoding 也在 IdGlobal.pas 中声明。你不能使用 Delphi XE 或 XE2 也没有 TIdTextEncodingIndyUTF8Encoding() 可用,因为它们在 Indy 的源代码中被广泛使用。如果编译器抱怨它们都未声明,那我认为您根本没有在代码中的 uses 子句中添加 IdGlobal
  • 是的。我又试了一次,发现 TidtextEncoding !!我不知道为什么我以前找不到它!也许我拼错了。
猜你喜欢
  • 2014-09-04
  • 1970-01-01
  • 1970-01-01
  • 2011-08-26
  • 1970-01-01
  • 2011-10-03
  • 1970-01-01
  • 2016-01-26
  • 2016-10-10
相关资源
最近更新 更多