gpt4 book ai didi

delphi - 在 Delphi 中将 UTF8 转换为 ANSI (ISO-8859-1)

转载 作者:行者123 更新时间:2023-12-03 15:38:16 26 4
gpt4 key购买 nike

我对必须将 UTF8 字符串转换为 ANSI 字符串的代码有疑问。我的代码适用于元音重音,但对于字母 Ñ 则不起作用。该代码破坏了字符串。我该如何纠正这个错误?

UTF8 格式的字符串:EDIFICIO PEàAS BLANCAS
如果正确的话,我在 ANSI 中拥有的字符串:EDIFICIO PEÑAS BLANCAS
我现在的 ANSI 字符串:EDIFICIO PE

代码在这里:

    function TFormMain.convertir_utf8_ansi(const Source: string):string;
var
Iterator, SourceLength, FChar, NChar: Integer;
begin
Result := '';
Iterator := 0;
SourceLength := Length(Source);
while Iterator < SourceLength do
begin
Inc(Iterator);
FChar := Ord(Source[Iterator]);
if FChar >= $80 then
begin
Inc(Iterator);
if Iterator > SourceLength then break;
FChar := FChar and $3F;
if (FChar and $20) <> 0 then
begin
FChar := FChar and $1F;
NChar := Ord(Source[Iterator]);
if (NChar and $C0) <> $80 then break;
FChar := (FChar shl 6) or (NChar and $3F);
Inc(Iterator);
if Iterator > SourceLength then break;
end;
NChar := Ord(Source[Iterator]);
if (NChar and $C0) <> $80 then break;
Result := Result + WideChar((FChar shl 6) or (NChar and $3F));
end
else
Result := Result + WideChar(FChar);
end;
end;

谢谢。

最佳答案

如果您使用的是 Delphi 2009 或更高版本,您应该让 RTL 为您完成转换:

type
Latin1String = type AnsiString(28591); // codepage 28591 = ISO-8859-1
var
utf8: UTF8String;
latin1: Latin1String;
begin
utf8 := ...; // your source UTF-8 string
latin1 := Latin1String(utf8);
end;

如果您使用的是 Delphi 2007 或更早版本,您仍然可以进行转换,只需让操作系统为您完成即可:

var
utf8: UTF8String;
latin1: AnsiString;
ws: WideString;
len: Integer;
begin
utf8 := ...; // your source UTF-8 string
len := MultiByteToWideChar(CP_UTF8, 0, PAnsiChar(utf8), Length(utf8), nil, 0);
SetLength(ws, len);
MultiByteToWideChar(CP_UTF8, 0, PAnsiChar(utf8), Length(utf8), PWideChar(ws), len);
len := WideCharToMultiByte(28591, 0, PWideChar(ws), Length(ws), nil, 0, nil, nil);
SetLength(latin1, len);
WideCharToMultiByte(28591, 0, PWideChar(ws), Length(ws), PAnsiChar(latin1), len, nil, nil);
end;

关于delphi - 在 Delphi 中将 UTF8 转换为 ANSI (ISO-8859-1),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33613521/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com