- 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
使用 TMemo 控件编写 Delphi XE 2 Windows 窗体应用程序:
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;
在执行 UTF8ToWideString
对话之前,我检查了 gLine
的内容,在英语/美国语言环境 Windows 下,它是:
$ED $85 $8C $EC $8A $A4 $ED $8A $B8
顺便说一句,如果我读取带有 BOM 的同一文件,我会得到正确的 3 字节前导码,并且执行 UTF8 解码时的输出是相同的。到目前为止一切正常!
切换 Windows 7 (x64) 以使用韩语作为不支持 Unicode 的应用程序的代码页(区域和语言 --> 管理选项卡 --> 更改系统区域设置 --> 韩语(韩国)。重新启动计算机。
使用上述应用程序读取同一文件(UTF8 w/o BOM),并且 gLine
现在具有十六进制值:
$3F $8C $EC $8A $A4 $3F $3F
TMemo 中的输出:?�스??
假设 ReadLn()
(以及与此相关的 Read()
)尝试将 UTF8 序列映射为韩语多字节序列(即尝试解释 $ ED $85,不能,所以在问号中的潜艇 $3F)。
使用 TFileStream
准确读取预期的字节数(9 个无 BOM),内存中的十六进制现在正好是:
$ED $85 $8C $EC $8A $A4 $ED $8A $B8
TMemo 中的输出:테스트(完美!)
问题: 懒惰 - 我有很多遗留例程,可以逐行解析可能很大的文件,并且我想确保不需要编写例程来手动读取新文件每个文件的行。
问题:
为什么 Read()
没有返回文件中找到的确切字节字符串?是因为我使用的是 TextFile
类型,所以 Delphi 使用非 unicode 代码页进行一定程度的解释吗?
是否有内置方法可以逐行读取 UTF8 编码文件?
更新:
刚刚遇到 Rob Kennedy 的解决方案 this post这让我重新认识了 TStreamReader,它回答了如何优雅地逐行读取 UTF8 文件的问题。
最佳答案
Is there a built in way to read a UTF8 encoded file line by line?
使用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) 时,为什么 ReadLine 会误解 UTF 8 文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29186026/
有人可以为韩语、印尼语、泰语和越南语推荐一个开源的 POS 标记器吗? 我可以用它来标记我目前拥有的语料库数据。 (例如 the stanford-postagger ) 如果您是开发人员并且愿意分享
我正在尝试在同一个文件中写出英语、日语和韩语。 这是我的做法: new File("genned/test123.txt").write("안녕하세요 hello こんにち", "utf8") 生成的
许多日语字体都有标准 ASCII 拉丁字符的特殊固定宽度变体,其宽度是字体的汉字/假名字符标准固定宽度的一半。这样,您只需为每个日语字符使用 2 个拉丁字符即可垂直排列拉丁语和日语文本。这被称为“半角
问题是我们是否有一个段落同时包含韩语(韩语)字符和罗马字符。 CSS 中有没有办法让韩文字符使用某种字体,而罗马字符使用另一种字体? 例如,我想对韩文使用 Noto Sans KR,对罗马字符使用 H
我正在尝试验证用户输入(在 Python 中)并查看是否使用了正确的语言,在本例中为韩语。让我们用韩语单词表示电子邮件地址:이메일 주소 我可以像这样检查每个字符: import unicodedat
我正在用 C 语言制作一个网络服务器。我需要从 url 获取参数以进行计算。问题是人们可以在一个字段(名称)中键入 unicode 字符。然而,当我的服务器收到那个请求时,这些 unicode 字
此前ios最新版微信有边写边译功能,输入的对话可以自动翻译成英语、韩语、日语等多种语言,不少安卓用户羡慕不已!不过就在昨天微信安卓8.0.18内测版的推出新增了边写边译功能,安卓的小伙伴们也终于可以
我在Windows 10中使用了Sublime Text 3。 从上面的截图中可以看到,韩文/中文/日文字符在“转到任何内容”文本输入,侧边栏和选项卡标题中均被打断。 有谁知道如何解决这个问题?我认为
我尝试在 python 中读取一些以“euc-kr”编码的韩语文本文件,但出现了一些错误。在检查 encodings 模块一段时间后,我了解到该模块以看似非常奇怪的方式对韩语字符进行编码。我举个例子
我正在尝试对 Hangul(韩语字符)进行颜色编码。每个“ block ”都会创建一个韩语音节。 Hangul 被分解为 Jamo(类似于英语中的字母)。当您键入韩语中的 jamo/字母时,它们通常会
我需要在包含标题的 2.000.000 个数据库行中进行搜索,例如歌曲。我需要一个能够快速提供结果、适用于 iOS 平台并支持 unicode 字符集的解决方案。我正在考虑使用 sqlite 的 FT
当我尝试通过 CkFtp2.java 客户端使用日语/韩语/阿拉伯语用户名/密码登录 FTP 服务器时,失败并显示消息“530 请先使用 USER 和 PASS 登录”。当我使用英文用户名/密码时,一
我遇到了 JPasswordField 组件尝试使用亚洲复合字符的不一致行为的问题。 我的代码是: final JCheckBox visiblePassword = new JCheckBo
我正在开发一个 vue 项目,这是一个小错误的修复。但这让我很难受。 我制作了 v-text-field 仅输入数字,看起来效果很好。 我只想输入数字,因此我使用 keydown 事件来使用 Pre
我是一名优秀的程序员,十分优秀!