Форум программистов, компьютерный форум, киберфорум
Наши страницы

Turbo Pascal

Войти
Регистрация
Восстановить пароль
 
Istar
#1

Преобразование ANSI->Unicode - Turbo Pascal

21.11.2012, 11:11. Просмотров 551. Ответов 3
Метки нет (Все метки)

Задача такая: есть входной текстовый файл, нужно изменить кодировку на unicode и записать в выходной. Не могу сообразить, как записывать в unicode. Младший и старший байт получаю делением на цело и остатком от деления кода символа в юникоде, но если записывать как char(старший_байт) а затем char(младший_байт) получается не то, что надо. Может я где-то чего-то упустил, не могу сообразить.
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.11.2012, 11:11
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Преобразование ANSI->Unicode (Turbo Pascal):

Символическое дифференцирование-ввод формулы в связный список, преобразование в ПОЛИЗ, обратное преобразование - Pascal
Прошу помогите мне. Символическое дифференцирование-ввод формулы в связный список, преобразование в ПОЛИЗ, обратное преобразование в...

В ShowMessage вывести один символ Ansi? - Pascal
ShowMessage(inttostr(ord('а'))); // а - русский символ (английский выводит, а русский ошибка: unit1.pas(66,24) Error: Ordinal expression...

ASCII, Unicode. - Pascal
Дана фраза: «Скорость вычисляется по формуле S=t*v » Вычислить, сколь-ко байт необходимо для хранения в памяти этой фразы, если для...

Перевести строку, содержащую путь к файлу в стандарте ANSI С, в строку в стандарте фирмы Borland - Turbo Pascal
ЗАДАНИЕ: Согласно стандарту ANSI С, при задании пути к файлу в программе на языке С, каталоги разделяются символом "/", а в стандарте фирмы...

Преобразование функций из Ansi в Unicode - C++ WinAPI
Добрый день ! Подскажите пожалуйста какое имя будет иметь универсальная функция для АНСИ и ЮНИКОДА ? В АНСИ она имеет название...

Unicode/Ansi - C++ Builder
Доброго! Скорее всего в будущем будет необходимость сделать интерфейс программы на нескольких языках "Рус, Укр, Бел". Ну в программе, все...

3
GoodFluttershy
0 / 0 / 0
Регистрация: 14.11.2015
Сообщений: 1
22.10.2017, 01:32 #2
Неужели никто не знает как? Мне самому блин нужно..
0
ФедосеевПавел
Модератор
2496 / 1399 / 582
Регистрация: 01.02.2015
Сообщений: 4,755
22.10.2017, 16:05 #3
Возьмите на Wikipedia описание вашей кодировки,
например, https://ru.wikipedia.org/wiki/Windows-1251

В приведённых таблицах кроме изображения символа присутствует код unicode.

Составьте массив из 256 слов (word), в котором будет unicode. При выполнении преобразования обращайтесь к ней.
Выходной файл делайте не Text, а просто file of word.

Всё.
0
Cyborg Drone
Модератор
4728 / 2895 / 1130
Регистрация: 17.08.2012
Сообщений: 9,219
23.10.2017, 16:56 #4
В Turbo Pascal? GoodFluttershy, Вам надо было свою тему создавать. Полагаю, Вам нужна программа хоть с каким-то интерфейсом, и, наверное, под винды. И никогда не пишите "неужели никто не знает как?", это очень нехорошо, поскольку многие знают очень обидный ответ на этот вопрос.

В дополнение к тому, что написал ФедосеевПавел.

ФедосеевПавел на самом деле предложил перекодировать CP1251 в UTF-16 LE без BOM. Вообще, сейчас наиболее распространены форматы UTF-8 и UTF-8 с BOM. Принцип кодирования: Википедия: UTF-8. Лучше всего в UTF-8 и перекодировать.

Вот, набросал на скорую руку. Без проверок корректности ввода, без обработки ошибок и с никаким интерфейсом. Не пробовал, сейчас не на чем, но, думаю, в TP программа скомпилируется.
Программа перекодирует из CP866 или CP1251 в UTF-8 или UTF-16 LE, BOM добавляется по желанию.
Если желаете, можете переделать под оконное приложение.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
const CP: array[boolean, $80..$FF] of word = ((
$410,   $411,   $412,   $413,   $414,   $415,   $416,   $417,
$418,   $419,   $41A,   $41B,   $41C,   $41D,   $41E,   $41F,
$420,   $421,   $422,   $423,   $424,   $425,   $426,   $427,
$428,   $429,   $42A,   $42B,   $42C,   $42D,   $42E,   $42F,
$430,   $431,   $432,   $433,   $434,   $435,   $436,   $437,
$438,   $439,   $43A,   $43B,   $43C,   $43D,   $43E,   $43F,
$2591,  $2592,  $2593,  $2502,  $2524,  $2561,  $2562,  $2556,
$2555,  $2563,  $2551,  $2557,  $255D,  $255C,  $255B,  $2510,
$2514,  $2534,  $252C,  $251C,  $2500,  $253C,  $255E,  $255F,
$255A,  $2554,  $2569,  $2566,  $2560,  $2550,  $256C,  $2567,
$2568,  $2564,  $2565,  $2559,  $2558,  $2552,  $2553,  $256B,
$256A,  $2518,  $250C,  $2588,  $2584,  $258C,  $2590,  $2580,
$440,   $441,   $442,   $443,   $444,   $445,   $446,   $447,
$448,   $449,   $44A,   $44B,   $44C,   $44D,   $44E,   $44F,
$401,   $451,   $404,   $454,   $407,   $457,   $40E,   $45E,
$B0,    $2219,  $B7,    $221A,  $2116,  $A4,    $25A0,  $A0
), (
$402,   $403,   $201A,  $453,   $201E,  $2026,  $2020,  $2021,
$20AC,  $2030,  $409,   $2039,  $40A,   $40C,   $40B,   $40F,
$452,   $2018,  $2019,  $201C,  $201D,  $2022,  $2013,  $2014,
$0,     $2122,  $459,   $203A,  $45A,   $45C,   $45B,   $45F,
$A0,    $40E,   $45E,   $408,   $A4,    $490,   $A6,    $A7,
$401,   $A9,    $404,   $AB,    $AC,    $AD,    $AE,    $407,
$B0,    $B1,    $406,   $456,   $491,   $B5,    $B6,    $B7,
$451,   $2116,  $454,   $BB,    $458,   $405,   $455,   $457,
$410,   $411,   $412,   $413,   $414,   $415,   $416,   $417,
$418,   $419,   $41A,   $41B,   $41C,   $41D,   $41E,   $41F,
$420,   $421,   $422,   $423,   $424,   $425,   $426,   $427,
$428,   $429,   $42A,   $42B,   $42C,   $42D,   $42E,   $42F,
$430,   $431,   $432,   $433,   $434,   $435,   $436,   $437,
$438,   $439,   $43A,   $43B,   $43C,   $43D,   $43E,   $43F,
$440,   $441,   $442,   $443,   $444,   $445,   $446,   $447,
$448,   $449,   $44A,   $44B,   $44C,   $44D,   $44E,   $44F
)); //в таблице первая половина CP866, вторая половина CP1251
var f, g: file of byte; //переменные для входного и выходного 8-битного файла
    h: file of word; //переменная для выходного 16-битного файла
    c, u, b: boolean; //кодовая страница, разновидность юникода, наличие BOM
    n, oc: byte; //буферная переменная, количество октетов
    o: array[1..3] of byte; //октеты
begin
  writeln('1: CP1251');
  writeln('2: CP866');
  readln(n);
  c := n = 1; //c = true: CP1251 (русская кодировка Windows); c = false: CP866 (русская кодировка DOS)
  writeln('1: UTF-8');
  writeln('2: UTF-16 LE');
  readln(n);
  u := n = 1; //u = true: UTF-8; u = false: UTF-16
  writeln('1: with BOM');
  writeln('2: without BOM');
  readln(n);
  b := n = 1; //b = true: UTF файл с BOM; b = false: UTF файл без BOM
  assign(f, 'd:\cp.txt'); //связываем переменную со входным файлом
  reset(f); //и открываем его на чтение
  if u //******************************** если UTF-8
    then begin //то перекодируем...
      assign(g, 'd:\utf.txt'); //связываем переменную с 8-битным выходным файлом
      rewrite(g); //и открываем его на запись
      if b then write(g, $EF, $BB, $BF); //пишем BOM, если он нужен
      while not eof(f) do //обрабатываем файл
        begin
          read(f, n); //читаем байт из входного файла
          if n < $80 //если до 7 бит,
            then begin //то записываем без перекодировки
              oc := 1;
              o[1] := n
            end
            else if CP[c, n] < $8FF //если до 11 бит,
              then begin //то
                oc := 2; //2 октета
                o[1] := (CP[c, n] shr 6) or $C0; //первый октет
                o[2] := (CP[c, n] and $3F) or $80 //второй октет
              end
              else begin //если до 16 бит, то
                oc := 3; //3 октета
                o[1] := (CP[c, n] shr 12) or $E0; //первый октет
                o[2] := ((CP[c, n] shr 6) and $3F) or $80; //второй октет
                o[3] := (CP[c, n] and $3F) or $80 //третий октет
              end;
          for n := 1 to oc do write(g, o[n]) //пишем октеты
        end;
      close(g) //закрываем выходной 8-битный файл
    end
    else begin //******************************** если UTF-16
      assign(h, 'd:\utf.txt'); //связываем переменную с 16-битным выходным файлом
      rewrite(h); //открываем файл для записи
      if b then write(h, $FEFF); //если нужен BOM, то добавляем его
      while not eof(f) do //обрабатываем файл
        begin
          read(f, n); //читаем байт из входного файла
          if n < $80 //если меньше 7 бит
            then write(h, n) //то записываем без перекодировки
            else write(h, CP[c, n]) //иначе перекодируем
        end;
      close(h) //закрываем выходной 16-битный файл
    end;
  close(f); //закрываем входной файл
  write('Complete.'); //так, для порядка, пишем, что всё вроде бы нормально.
  readln
end.
Имена входного и выходного файла заданы в программе. Потому что.
1
23.10.2017, 16:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.10.2017, 16:56
Привет! Вот еще темы с ответами:

ANSI и UNICODE - C++
#include &lt;iostream&gt; #include &lt;windows.h&gt; using namespace std; int main(){ TCHAR j; return 0;

ANSI to Unicode - C++
Всем доброго времени суток! Есть задачка преобразовать строку в cp1251 в строку в unicode и сохранить ее в файл в кодировке unicode...

ANSI to Unicode - C++
Hi all. Вопрос к экспертам :) Хочу сохранить строку текста (кириллица) в текстовый файл. Строка в ANSI, а нужно сконвертировать в...

ANSI and Unicode - Delphi
Доброго времени суток, Господа! У меня вот такой вопрос: Если я работаю со строками ShortString(Unicode) в некой структуре может ли файл...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru