【问题标题】:HTML Entity Converter in AdaAda 中的 HTML 实体转换器
【发布时间】:2011-12-27 15:00:23
【问题描述】:

我想编写一个 Ada 程序,用适用的 HTML 实体替换 Latin1 字符,但我的代码不起作用:text.txtconverted.txt 始终相同。我的导师说代码是正确的。 提前致谢!

这是我的代码:

with Ada.Text_IO;
procedure Entity_Converter is
   use Ada.Text_IO;

   Source : File_Type;
   Target : File_Type;
   Source_Char : Character;
begin
   Open (Source, In_File, "test.txt");
   Create (Target, Out_File, "converted.txt");
   while not End_Of_File (Source) loop
      Get (Source, Source_Char);
      case Source_Char is
         when 'ä' =>
            Put (Target, "ä");
         when 'Ä' =>
            Put (Target, "Ä");
         when 'ö' =>
            Put (Target, "ö");
         when 'Ö' =>
            Put (Target, "Ö");
         when 'ü' =>
            Put (Target, "ü");
         when 'Ü' =>
            Put (Target, "Ü");
         when 'ß' =>
            Put (Target, "ß");
         when others =>
            Put (Target, Source_Char);
      end case;
   end loop;
   Close (Source);
   Close (Target);
end Entity_Converter;

【问题讨论】:

    标签: replace ada html-entities latin1


    【解决方案1】:

    结果取决于源文本和测试文件的编码。

    要解决前者,请使用包Ada.Characters.Latin_1的常量:

    with Ada.Characters.Latin_1;
    use Ada.Characters.Latin_1;
    ...
       case Source_Char is
          when LC_A_Diaeresis =>
             Put (Target, "ä");
          when UC_A_Diaeresis =>
             Put (Target, "Ä");
          ...
          when LC_German_Sharp_S =>
             Put (Target, "ß");
          when others =>
             Put (Target, Source_Char);
       end case;
    

    后者取决于你的编辑器。

    【讨论】:

    • 太棒了!编码出现问题。谢谢!
    【解决方案2】:

    我在 Mac 上运行,我复制了你的源代码。当我编译它时,它抱怨(例如)’ä’ 需要双引号;提示源使用宽字符。好像是UTF-8[1],所以我用-gnatW8编译,貌似成功了。

    然后我在它自己的源文本的副本上运行程序,它未能转换文本

    使用-gnatdg 编译,这使得 GNAT 生成其内部源树的表示,我明白了

      ada__text_io__get (source, source_char);
      case source_char is
         when '["e4"]' =>
            ada__text_io__put__3 (target, "ä");
         when '["c4"]' =>
            ada__text_io__put__3 (target, "Ä");
    

    在我看来,GNAT 已经读取了ä 的 UTF-8 编码,并在 case 语句中使用了 Latin-1 版本;考虑到它说的是Character,这并非不合理,并且足以解释为什么它无法自行转换。

    然后我尝试使用Ada.Wide_Text_IOWide_Character。遗憾的是,由于与以前相同的原因,该程序失败了。我们可以看一个功能吗?甚至是一个错误?

    [1] 当然,由于我下载它的迂回方式,该文件可能以 UTF-8 结尾。

    【讨论】:

    • 有趣。在 Mac 上,BBEdit/TextWrangler 可以方便地设置编码,但我最终还是使用了echo "\0304\0344…\0334\0374\0337" > test.txt 来创建测试输入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    • 1970-01-01
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    • 2017-10-23
    相关资源
    最近更新 更多