Cap*_*101 3 delphi macos utf-8
我有一个问题,将UTF-8编码的字符串转换回delphi可用的东西.该应用程序是用XE8编写的,并且正在Windows和OSX上部署.该应用程序分别在Windows和OSX上使用LimeLM API dll和dylib库.在Windows上一切正常,我遇到的问题是转换从OSX上的dylib库返回的字符串.我很欣赏dylib中的所有字符串都必须是UTF-8编码的.limeLM函数返回一个PWideChar值,我假设它是UTF编码的.但是我使用哪个函数来尝试将值转换为可用于Delphi的东西并不重要,我得到的只是垃圾.
这是功能:
class function TurboActivate.GetFeatureValue(featureName: String): String;
var
value : PWideChar;
FieldName : PWideChar;
tmpStr : String;
begin
{$IFDEF MSWINDOWS}
FieldName := PwideChar(featureName);
{$ENDIF}
{$IFDEF MACOS}
FieldName := PWideChar(UTF8Encode(featureName));
{$ENDIF}
value := GetFeatureValue(FieldName, nil);
if (value = '') then
begin
raise ETurboActivateException.Create('Failed to get feature value. the feature doesn''t exist.');
end;
{$IFDEF MSWINDOWS}
Result := value;
{$ENDIF}
{$IFDEF MACOS}
tmpStr := UTF8ToString(value);
ShowMessage(tmpStr);
tmpStr := UTF8ToWideString(value);
ShowMessage(tmpStr);
tmpStr := UTF8ToUnicodeString(value);
ShowMessage(tmpStr);
tmpStr := UTF8ToAnsi(value);
ShowMessage(tmpStr);
Result := TmpStr;
{$ENDIF}
end;
Run Code Online (Sandbox Code Playgroud)
肯定有一个解码的价值,值='散汤湡獤杀浔汧浥楡䌴䌴䅓㜭䙇䵙㑗㑗㈭ⵆ䥉倏䈭尺'#4
但是tmpStr总是包含'????????????????
任何帮助将不胜感激.
value ='散汤湡獤杀浔汧浥楡潣䌴䅓䙇ⵊ䵙㑗㈭呖ⵆ䥉倏'尺'#4
这表示您解释了8位文本,可能是UTF-8编码,就好像它是UTF-16编码的一样.作为一个宽泛的规则,当您看到带有中文字符的UTF-16字符串时,要么是正确解释的中文文本,要么是错误解释的8位文本.
当您将该文本正确解释为UTF-8时,它是:
cedlands@googlemail.com 4CSA-7GFJ-YMW4-2VTF-II5Q-BNTA??
Run Code Online (Sandbox Code Playgroud)
我用这段代码获得了:
Writeln(TEncoding.UTF8.GetString(
TEncoding.Unicode.GetBytes('???????????m???????????????'#4)));
Run Code Online (Sandbox Code Playgroud)
但请注意,如果查看当时返回的字节数组,TEncoding.Unicode.GetBytes('???????????m???????????????'#4)您将看到它包含null.实际上,字符串在电子邮件地址后以空值终止.
问题从这里开始:
value : PWideChar;
....
value := GetFeatureValue(FieldName, nil);
Run Code Online (Sandbox Code Playgroud)
实际上是GetFeatureValue回归PAnsiChar.假设我正确地解释你,有效载荷是UTF-8编码的.
所以你需要做出以下改变:
GetFeatureValue为PAnsiChar.value是PAnsiChar.value使用UnicodeFromLocaleChars或转换为字符串TEncoding.GetString.这可能看起来像这样:
var
Bytes: TBytes;
....
SetLength(Bytes, StrLen(value));
Move(value^, Pointer(Bytes)^, Length(Bytes));
str := TEncoding.UTF8.GetString(Bytes);
Run Code Online (Sandbox Code Playgroud)
现在,对于设置str为的问题中的数据cedlands@googlemail.com.如上所述,数据包含一个空终止符,当它被错误地解释为UTF-16时,它无法终止该字符串.也就是说,文本4CSA-7GFJ-YMW4-2VTF-II5Q-BNTA??来自缓冲区溢出.
| 归档时间: |
|
| 查看次数: |
1433 次 |
| 最近记录: |