Пример: преобразование символов из ASCII в Unicode

Пример: преобразование символов из ASCII в Unicode

Программа 2.4 достраивает программу 1.3, в которой использовалась вспомогательная функция CopyFile. С копированием файлов вы уже знакомы, поэтому в данном примере эта операция дополняется преобразованием файла к кодировке Unicode в предположении, что первоначальной кодировкой символов является ASCII, хотя проверка этого предположения не производится. В программе предусмотрены некоторые возможности вывода сообщений об ошибках и параметр, позволяющий подавить замену существующего файла; завершающий вызов функции CopyFile заменен в программе вызовом новой функции, которая Выполняет преобразование символьных строк файла из кодировки ASCII в кодировку Unicode.

В данной программе основное внимание уделяется обеспечению возможности успешного завершения преобразования. Фактическое выполнение преобразования сосредоточено в единственной функции, вызываемой в самом конце программы. Этот фрагмент, как и аналогичный ему фрагмент предыдущей программы, послужит нам шаблоном и будет вновь использоваться в последующих программах без повторения его исходного кода.

Обратите внимание на вызов функции _taccess, проверяющей существование файла. Эта функция является обобщенной версией функции access, которая имеется в библиотеке UNIX, но не входит в состав стандартной библиотеки С. Ее определение содержится в файле <io.h>. Если говорить точнее, функция _taccess осуществляет проверку прав доступа к файлу в соответствии с режимом, установленным значением второго параметра. Значение 0 задает проверку существования файла, 2 — проверку наличия разрешения на запись в файл, 4 — проверку наличия разрешения на чтение из файла, 6 — проверку наличия разрешения как на чтение из файла, так и на запись в файл (эти значения не связаны напрямую с такими параметрами доступа, используемыми в Windows, как GENERIC_READ). Альтернативой проверке существования файла могло бы быть открытие дескриптора при помощи функции CreateFile и его последующее закрытие после проверки действительности дескриптора. 

Программа 2.4. atou: преобразование файла с выводом сообщений об ошибках 

/* Глава 2. atou – копирование файлов с преобразованием из ASCII в Unicode. */

#include "EvryThng.h"

BOOL Asc2Un(LPCTSTR, LPCTSTR, BOOL);

int _tmain(int argc, LPTSTR argv[]) {

 DWORD LocFileIn, LocFileOut;

 BOOL DashI = FALSE;

 TCHAR YNResp[3] = _T("y");

 /* Получить параметры командной строки и индекс входного файла. */

 LocFileIn = Options(argc, argv, _T("i"), &DashI, NULL);

 LocFileOut = LocFileIn + 1;

 if (DashI) { /* Существует ли выходной файл? */

  /* Обобщенная версия функции access, осуществляющая проверку существования файла. */

  if (_taccess(argv[LocFileOut], 0) == 0) {

   _tprintf(_T("Перезаписать существующий файл? [y/n]"));

   _tscanf(_T ("%s"), &YNResp);

   if (lstrcmp(CharLower(YNResp), YES) != 0) ReportError(_T("Отказ от перезаписи"), 4, FALSE);

  }

 }

 /* Эта функция построена на основе функции CopyFile. */

 Asc2Un(argv[LocFileIn], argv [LocFileOut], FALSE);

 return 0;

}

Программа 2.5 — это вызываемая в программе 2.4 функция Asc2Un, осуществляющая преобразование кодировки символов.

Программа 2.5. Функция Asc2Un

#include "EvryThng.h"

#define BUF_SIZE 256

BOOL Asc2Un(LPCTSTR fIn, LPCTSTR fOut, BOOL bFailIfExists)

/* Функция копирования файлов с преобразованием из ASCII в Unicode. Функция построена на основе функции CopyFile. */

{

 HANDLE hIn, hOut;

 DWORD dwOut, nIn, nOut, iCopy;

 CHAR aBuffer[BUF_SIZE];

 WCHAR uBuffer [BUF_SIZE];

 BOOL WriteOK = TRUE;

 hIn = CreateFile(fin, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 

 /* Определить поведение функции CreateFile, если выходной файл уже существует. */

 dwOut = bFailIfExists ? CREATE_NEW : CREATE_ALWAYS;

 hOut = CreateFile(fOut, GENERIC_WRITE, 0, NULL, dwOut, FILE_ATTRIBUTE_NORMAL, NULL);

 while (ReadFile(hIn, aBuffer, BUF_SIZE, &nIn, NULL)  && nIn > 0 && WriteOK) {

  for (iCopy = 0; iCopy < nIn; iCopy++)

   /* Преобразовать каждый символ. */

   uBuffer[iCopy] = (WCHAR)aBuffer [iCopy];

  WriteOK = WriteFile(hOut, uBuffer, 2 * nIn, &nOut, NULL);

 }

 CloseHandle(hIn);

 CloseHandle(hOut);

 return WriteOK;

}

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Стратегии использования символов Unicode

Из книги MySQL: руководство профессионала автора Паутов Алексей В

Стратегии использования символов Unicode Приступая к работе над проектом в Windows, либо для разработки нового программного кода, либо для переноса существующего, программист, в зависимости от требований проекта, может выбрать одну из четырех стратегий.1. Только 8-битовые


Пример: преобразование файла с использованием расширенного ввода/вывода

Из книги Программирование на языке Ruby [Идеология языка, теория и практика применения] автора Фултон Хэл

Пример: преобразование файла с использованием расширенного ввода/вывода Программа 14.3 (atouEX) представляет собой переработанную версию программы 14.1. Эти программы иллюстрируют различие между двумя методами асинхронного ввода/вывода. Программа atouEx аналогична программе


Преобразование символов из кодировки ASCII в Unicode

Из книги Технология XSLT автора Валиков Алексей Николаевич

Преобразование символов из кодировки ASCII в Unicode Измерения выполнялись для восьми программ, каждая из которых преобразовывала файл размером 12,8 Мбайт в файл размером 25,6 Мбайт. Соответствующие результаты представлены в табл. В.2.1. Программа atou (программа 2.4) сопоставима с


10.9. Преобразование набора символов столбца

Из книги Язык программирования Си для персонального компьютера автора Бочков C. О.

10.9. Преобразование набора символов столбца Чтобы преобразовывать двоичный или не двоичный строковый столбец, чтобы использовать специфический набор символов, примените ALTER TABLE. Для успешного преобразования одно из следующих условий должно примениться:Если столбец


10.10.1. Наборы символов Unicode

Из книги Искусство программирования на языке сценариев командной оболочки автора Купер Мендель

10.10.1. Наборы символов Unicode MySQL имеет два набора символов Unicode. Вы можете сохранять текст приблизительно для 650 языков, используя эти наборы символов.Объединения ucs2 (UCS-2 Unicode):ucs2_bin ucs2_czech_ci ucs2_danish_ci ucs2_esperanto_ci ucs2_estonian_ci ucs2_general_ci (default) ucs2_hungarian_ci ucs2_icelandic_ci ucs2_latvian_ci ucs2_lithuanian_ci ucs2_persian_ci


2.15. Преобразование символов в коды ASCII и обратно

Из книги Linux и UNIX: программирование в shell. Руководство разработчика. автора Тейнсли Дэвид

2.15. Преобразование символов в коды ASCII и обратно В Ruby символ представляется целым числом. Это поведение изменится в версии 2.0, а возможно и раньше. В будущем предполагается хранить символы в виде односимвольных строк.str = "Martin"print str[0] # 77Если в конец строки дописывается


Определение класса символов и преобразование символов

Из книги автора

Определение класса символов и преобразование символов Функция Краткое описание isalnum проверка на букву или цифру isalpha проверка на букву isascii проверка на символ из набора кодировки ASCII iscntrl проверка на управляющий символ isdigit проверка на десятичную


Пример 17-4. Вывод многострочных сообщений с подавлением символов табуляции

Из книги автора

Пример 17-4. Вывод многострочных сообщений с подавлением символов табуляции #!/bin/bash# То же, что и предыдущий сценарий, но...# Символ "-", начинающий строку-ограничитель встроенного документа: <<-# подавляет вывод символов табуляции, которые могут встречаться в теле


Пример 22-4. Преобразование чисел в римскую форму записи

Из книги автора

Пример 22-4. Преобразование чисел в римскую форму записи #!/bin/bash# Преобразование чисел из арабской формы записи в римскую# Диапазон: 0 - 200# Расширение диапазона представляемых чисел и улучшение сценария# оставляю вам, в качестве упражнения.# Порядок использования: roman