Форум программистов, компьютерный форум, киберфорум
Наши страницы
Turbo Pascal
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Istar
0 / 0 / 0
Регистрация: 17.11.2012
Сообщений: 1
1

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

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

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

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

В ShowMessage вывести один символ Ansi?
ShowMessage(inttostr(ord('а'))); // а - русский символ (английский выводит, а...

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

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

Преобразование функций из Ansi в Unicode
Добрый день ! Подскажите пожалуйста какое имя будет иметь универсальная...

3
GoodFluttershy
0 / 0 / 0
Регистрация: 14.11.2015
Сообщений: 1
22.10.2017, 01:32 2
Неужели никто не знает как? Мне самому блин нужно..
0
ФедосеевПавел
Модератор
3647 / 2022 / 835
Регистрация: 01.02.2015
Сообщений: 6,726
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
Модератор
5290 / 3169 / 2441
Регистрация: 17.08.2012
Сообщений: 10,178
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.10.2017, 16:56

ANSI и UNICODE
#include &lt;iostream&gt; #include &lt;windows.h&gt; using namespace std; int...

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

Unicode>>>ANSI
Помогите записать содержимое файла с юникод кодировкой в мэмо, я так понял...


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

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

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