在 Delphi 7中将十六进制值或UTF-16 [LE]保存在文件中[使用这些代码时出错]

vybvopom  于 2023-05-17  发布在  其他
关注(0)|答案(2)|浏览(244)

继续我之前的问题:How to save UTF-16 (Little Endian) and String value inside a file in Delphi 7?
当我从this answer使用以下代码时:

uses
  Classes;
    
const
  BOM: WideChar = $FEFF;
var
  W: WideString;
  FS: TFileStream;
begin
  W := 'ᗿABC';
  FS := TFileStream.Create('text.txt', fmCreate);
  try
    FS.WriteBuffer(BOM, Sizeof(BOM));
    FS.WriteBuffer(PWideChar(W)^, Length(W) * Sizeof(WideChar));
  finally
    FS.Free;
  end;
end;

我有这些问题:
1.当我使用这个:W := 'ᗿABC';我的IDE显示W := '?ABC';我可以解决这个问题吗?因为[?]不是我的目标
1.当运行代码时,我在图像中得到错误:

xpszyzbs

xpszyzbs1#

  1. Delphi 中的代码编辑器不太支持Unicode字符,如果有的话。你真的应该停止使用一个25岁的编译器并升级。
    在任何情况下,请尝试以下操作:
W := #$15FF'ABC';

或者,你可能不得不采取类似这样的措施:

W := WideChar($15FF) + WideString('ABC');

1.尝试将整数值类型转换为WideChar

const
  BOM: WideChar = WideChar($FEFF);

否则,使用Word代替WideChar

const
  BOM: Word = $FEFF;
chhqkbe1

chhqkbe12#

使用 Delphi 7 kind ofWideString s中与Unicode兼容,但不一致:

var
  RegExprWLineSeparators: WideString;
begin
  // In the following line the literal ends up producing ASCII question marks for the 5th and 6th character.
  RegExprWLineSeparators:= #$d#$a#$b#$c+ WideChar($2028)+ WideChar($2029)+ #$85;

  // But assigning characters individually will make both correct - so first do the one above
  // (or provide anything, because you want to reassign it anyway) and later make it per character.
  RegExprWLineSeparators[5]:= WideChar($2028);
  RegExprWLineSeparators[6]:= WideChar($2029);

有几个字符甚至不能用这种方式赋值(既不能通过文本字面量赋值,也不能通过序数字面量赋值),因此您可以使用不同的方法来测试这些字符:

var
  sText: Widestring;
begin
  sText:= <something>;

  // Checking if the first character is a UTF-16 BE or LE BOM
  case Word(sText[1]) of
    $FEFF,
    $FFFE: Delete( sText, 1, 1 );  // Remove such a character
  end;

拇指规则是:

  • 使用Word s并在使用文本文字时将其转换为WideChar
  • 比较/检查时使用Word而不是WideChar
  • 非字符(如U+FFFE和U+FFFF)通常是不可赋值的

作为一个初学者,应该避免使用 Delphi 7 for Unicode--当你对Unicode、UTF-16和Pascal有信心的时候,就应该这样做。我从Windows 2000在 Delphi 5上开始,后来继续使用Delphi 7,在不同的场合(正则表达式等)有类似的经验。
作为一个过时的 Delphi 版本的替代品,你可以尝试免费的Lazarus IDE for FPC--它使用UTF-8作为Unicode的一种方法,并且应该在代码中更好地处理/支持文本文字。IDE甚至看起来像健壮的 Delphi 7。

相关问题