- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在Delphi XE2中,使用AssignFile
和ReadLn()
例程,当系统语言环境为英语时,我只能读取和显示Unicode字符(来自UTF8编码文件)。
哪里失败
如果我将非Unicode应用程序的系统语言环境设置为韩语(我认为是代码页949)并重复相同的读取操作,则我的一些UTF8多字节对将替换为$3F
。这仅适用于使用ReadLn
,不适用于使用TFile.ReadAllText(aFilename, TEncoding.UTF8)
或TFileStream.Read()
的情况。
考试
1.我创建一个文本文件,UTF8 w / o BOM(Notepad ++),其中包含以下字符(在第二行显示十六进制等效项):
테스트
ed 85 8c ec 8a a4 ed 8a b8
procedure TForm1.ReadFile(aFilename:string);
var
gFile : TextFile;
gLine : RawByteString;
gWideLine : string;
begin
AssignFile(gFile, aFilename);
try
Reset(gFile);
Memo1.Clear;
while not EOF(gFile) do
begin
ReadLn(gFile, gLine);
gWideLine := UTF8ToWideString(gLine);
Memo1.Lines.Add(gWideLine);
end;
finally
CloseFile(gFile);
end;
end;
gLine
对话之前,我检查
UTF8ToWideString
的内容,在英语/美国语言环境下,它是:
$ED $85 $8C $EC $8A $A4 $ED $8A $B8
gLine
现在具有十六进制值:
$3F $8C $EC $8A $A4 $3F $3F
ReadLn()
(和
Read()
试图将UTF8序列映射为韩文多字节序列(即试图解释$ ED $ 85,不能解释为$ 3F的子对象)。
TFileStream
精确读取期望的字节数(9 w / o BOM),并且内存中的十六进制现在正好是:
$ED $85 $8C $EC $8A $A4 $ED $8A $B8
Read()
不返回文件中找到的确切字节字符串?是因为我使用的是
TextFile
类型,所以Delphi使用非Unicode代码页进行一定程度的解释吗?
最佳答案
是否有内置的方式逐行读取UTF8编码的文件?
使用TStreamReader
。它具有ReadLine()
方法。
procedure TForm1.ReadFile(aFilename:string);
var
gFile : TStreamReader;
gLine : string;
begin
Memo1.Clear;
gFile := TStreamReader.Create(aFilename, TEncoding.UTF8, True);
try
while not gFile.EndOfStream do
begin
gLine := gFile.ReadLine;
Memo1.Lines.Add(gLine);
end;
finally
gFile.Free;
end;
end;
procedure TForm1.ReadFile(aFilename:string);
begin
Memo1.Lines.LoadFromFile(aFilename, TEncoding.UTF8);
end;
关于delphi - 为什么非Unicode页面为韩语(949)时ReadLn会误解UTF8文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29186026/
印地问题。 我在 TIdTCPClient ReadLn 调用中添加了一个超时参数,以便我的线程可以经常检查是否终止。但是,如果发生超时,从那时起我将永远不会从 ReadLn 获取任何数据。如何重置
使用 Delphi 2010 和 Indy10 我正在尝试从 Delphi 读取服务器发送的事件。我已经成功创建了一个线程,它将订阅我的服务器(Python/Flask)上的连接并捕获事件。需要一个线
Haskell 中是否有像 Pascal 中的 ReadLn 那样的内置函数? 我想要这样的东西: λ> pascalReadLn :: IO (Int, Int, Int, Int) 1 2 3 4
此功能允许用户输入字符串列表。该函数采用长度并允许用户输入长度为 1 的更多行。然后检查每一行以确保它与原始行的长度相同。编码: readme :: IO [Line] readme = do li
我想在 IdTcpServer 上的 Indy10 中使用 AContext.Connection.IOHandler.ReadLn 但我不知道如何使用 ByteEncoding 参数。客户端是否必须
我想逐行处理文本文件。过去,我将文件加载到 StringList 中: slFile := TStringList.Create(); slFile.LoadFromFile(filename); f
当我运行以下代码时,没有出现运行时错误: printReverse :: IO () printReverse = do line IO a 和 getLine :: IO String r
我必须使用java与服务器发送和接收一些流。协议(protocol)是 telnet,如果我在 Windows 中使用 cmd 并执行以下命令:"telnet 10.0.1.5 9100" 并在 "^
我最近安装了 Leksah(Windows 7 64 位上的 0.10.0.4),这对于 Haskell 来说似乎是一个有趣的 IDE。但是,在使用程序时,当涉及到用户对程序的输入时,我显然忽略了一些
当使用 Delphi 的 ReadLn 将制表符分隔文件中的值读取到一系列变量中时,为什么当我单步执行调试器时某些变量没有被分配到适当的值? 即 x, y, z: Integer; ... ReadL
我的客户应用程序使用 writeln 和 readln 通过文本文件导出和导入相当多的 real 类型的变量。我尝试增加写入字段的宽度,因此代码如下所示: writeln(file, exportRe
我在使用 D 程序时遇到了一个非常奇怪的问题。 read("%s", variable) 本身工作正常,readln(variable) 本身工作正常,但是当我将两者放在一起时,readln() 似乎
当我尝试在 Delphi XE7 控制台应用程序中显示 UTF 8 文本时,我遇到了一个愚蠢但烦人的情况。看来 ReadLn 命令在第二次尝试后才读取正确的 UTF 8 字符。例如: prog
我使用 TClientSocket 与 Python 服务器进行了套接字通信。在意识到我无法使用 TClientSocket 在客户端上拥有更多功能后,我决定使用 INDY。我使用 Delphi In
我使用delphi 7。 我需要逐行读取一个utf-8文件,每行包含一个单词及其权重(一个数字)因此,我需要读取下一行,然后用分隔符(制表符)分隔行并将其保存在内存中。 所以, 1) Delphi 中
此代码无法在 GHC 7.0.3 中编译: import System.IO main = do z IO a .它从用户那里读取一行,然后将字符串解析为类型 a .什么是类型a ?它是你想
使用 Free Pascal IDE,我在 Windows 下遇到控制台 IO 的一些问题。 当我使用 Writeln 时,光标不会移动到下一行,而是停留在所写行的末尾。因此,如果我按 Enter 而
我一直在关注 Learn Haskell in 10 Minutes教程。一切顺利,直到我到达这条线: do { n <- readLn ; print (n^2) } 它不会在 ghci 中执行,而
readln 一直读到行尾(按下回车键),包含空格和所有内容, 我想要类似的东西,但对于 ansi c(不是 c++,需要用于 linux 和 windows) 我知道我可以创建一个函数来读取每个字符
我是一名优秀的程序员,十分优秀!