HTML Entity Converter в Аде - PullRequest
       31

HTML Entity Converter в Аде

2 голосов
/ 27 декабря 2011

Я хочу написать программу Ada, которая заменяет символы Latin1 соответствующими HTML-сущностями, но мой код не работает: text.txt и converted.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;

Ответы [ 2 ]

3 голосов
/ 27 декабря 2011

Результат зависит от кодировки как исходного текста, так и тестового файла.

Для адресации первого используйте константы пакета 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;

Последнее зависит от вашего редактора.

1 голос
/ 27 декабря 2011

Я работаю на 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 ä и использовал версию Latin-1 для оператора case; не без оснований, учитывая, что в нем написано Character, и этого вполне достаточно, чтобы объяснить, почему он не смог преобразовать себя.

Затем я попытался использовать Ada.Wide_Text_IO и Wide_Character. К сожалению, программа не удалась по той же причине, что и раньше. Можем ли мы смотреть на функцию? или даже ошибка?

[1] Возможно, файл попал в UTF-8 из-за того, что я его скачал, конечно же.

...