在Ada中读取文本文件:获取“行”;内容如下:;字节顺序标记也是如此

在Ada中读取文本文件:获取“行”;内容如下:;字节顺序标记也是如此,ada,byte-order-mark,Ada,Byte Order Mark,我试图在Ada中逐行读取一个文件,它是一个XML文本文件。我遵循这里的说明: 然而,有一个问题让我很恼火:“Get_Line”函数似乎不知道字节顺序标记,并将它们作为文本本身的一部分读取,这意味着当我对行进行raed时,第一行总是以一些不应该存在的额外字节开始 虽然手动从字符串中删除额外的字节没有什么大不了的,但我觉得奇怪的是,专用于文本输入/输出的函数不知道bom,必须有一种方法可以在ada中读取文本文件,而不必担心这一点。。。有吗?Ada.Text\u IO指定用于处理ISO-8859-1

我试图在Ada中逐行读取一个文件,它是一个XML文本文件。我遵循这里的说明:

然而,有一个问题让我很恼火:“Get_Line”函数似乎不知道字节顺序标记,并将它们作为文本本身的一部分读取,这意味着当我对行进行raed时,第一行总是以一些不应该存在的额外字节开始


虽然手动从字符串中删除额外的字节没有什么大不了的,但我觉得奇怪的是,专用于文本输入/输出的函数不知道bom,必须有一种方法可以在ada中读取文本文件,而不必担心这一点。。。有吗?

Ada.Text\u IO
指定用于处理ISO-8859-1编码文本,因此忽略UTF-8功能是正确的做法


<> > <代码>艾达.WieldTrimeSoIO和<代码>艾达.WieldWieldWordTeXiOI/<代码>也输出字节顺序标记,当被要求读取UTF-8编码文本时,您应该考虑将其作为错误报告给GCC——但是由于在艾达中有很多实现文本I/O包的详细定义,所以您应该准备好“惯用修复”。答案。

一种可能性是使用流属性并创建一个
UTF_8
文件类型来处理BOM的读取和丢弃。

Ada语言(和库)本身并不理解这样的概念。这完全取决于实现(但是,当您打开文件时,有一个
表单
参数允许您向其提供有关文件格式的信息。此参数的内容取决于您的特定Ada实现,您必须阅读其用户手册。第一个问题:您是否使用
表单
参数告诉它您已阅读正在加载UTF-8文件?如果没有,可能是假定该文件是Latin-1。@ajb:我正在使用AdaCore的实现(GNAT 2014)。我尝试使用“encoding=utf8”参数传递表单字符串,但没有任何更改。至于“对这些概念没有任何线索”的语言……老实说,我希望从“Text\u IO”包中得到一个函数了解文本文件的工作原理。我使用过很多语言(C#、VB、C++/qt、Java…)老实说,从来没有出现过这个问题。如果默认情况下没有检测到,这是很公平的,但必须有一种方法来排除BOM读取,而不是在代码中手动将其从流中删除……作为旁注,只有第一个字符才被视为透明BOM。当在流中稍后发现时,BOM不会自动删除自动。这是因为Unicode 4或5。早期版本的Unicode允许字符最终在中间流中更改(小端的UTF-16可能会变成大端的UTF-16,反之亦然)。