2015-05-20 4 views
0

У меня есть файл, который содержит как арабское, так и английское слово/буквы/цифры. Я пытаюсь распечатать файл, используя код от Here. Когда я открываю файл в блокноте, я вижу все смешные и нецензурные символы. Когда я сохраняю тот же файл, что и Юникод в Сохранить как ... меню файла (блокнот) и выбор Юникода, файл отображается правильно (я вижу арабские буквы и т. Д.).Чтение файла, содержащего арабский язык

Когда я открываю тот же файл в notepad++ единственный вариант, который отображает файл правильно это

Меню-> Кодировка> Character комплект-> арабский

С #, я пытаюсь прочитать файл построчно и распечатать его с помощью

ev.Graphics.DrawString(line, printFont, Brushes.Red, leftMargin, yPos, _sf); 

где line является линия из файла. Когда файл сохраняется в правом кодировке, все распечатывается в порядке. Но когда у нас есть проблемы с кодировкой, мы получаем кучу алмазов, вопросительные знаки и т. Д.

Вот несколько способов (из разных источников), которые я пытался открыть файл с правильной кодировкой (пожалуйста, дайте мне знать, если один из них должен работать, и я попробую еще раз):

Покушение 1

var arabic = Encoding.GetEncoding(1252); 
var bytes = arabic.GetBytes(line); 
line = arabic.GetString(bytes);` 

Покушение 2

streamToPrint = new StreamReader(this.filepath,System.Text.Encoding.UTF8,true); 

Покушение 3

byte[] utf8Bytes = Encoding.UTF8.GetBytes(line); 
line = Encoding.Unicode.GetString(utf8Bytes);` 

Ни один из них не работает. Может кто-нибудь любезно показать мне, какие изменения мне нужно внести в код Here, чтобы он читал файл и печатал его?

+0

GetEncoding (1252) не может быть прав. Попробуйте 1256, 864, 720. Или отправьте файл обратно, вы не хотите его. –

+0

@ HansPassant Спасибо. Я дам ему попытку и отправлю отчет – Zuzlx

+0

@ HansPassant 1256 (не 1252). Если вы дадите ответ, это будет «принятый ответ». Еще раз спасибо. – Zuzlx

ответ

4
var arabic = Encoding.GetEncoding(1252); 

Это не оно, 1252 - это кодовая страница Windows для Западной Европы и Северной и Южной Америки. Следующее ваше предположение: 1256, стандартная кодовая страница Windows для арабского языка. Следующее предположение должно быть унаследованным кодовым страницам MS-Dos, 864 и 720.

Такое несчастье должно вдохновить вас связаться с компанией или программистом, создавшим файл. Настало время их обновления. Лучший аргумент, который вы можете дать им, - это то, что вы сейчас доступны, вероятно, не будет, когда они нуждаются в , необходимо обновить.

1

Вам необходимо просмотреть спецификацию (байтовый заказ, U+FEFF), который должен быть первым символом Юникода в файле. Если он не найден, это либо простой ASCI, UTF-8 без знака порядка байтов, либо что-то нечетное.

Прочитайте первые несколько октетов файла. ВОМ кодирует по-разному для различных кодировок:

  • гекса FEBBBF указует UTF-8. ОДНАКО, для UTF-8 спецификация необязательна, это бессмысленно, что с UTF-8 является 8-битной кодировкой и всеми. Если он не найден, это не гарантирует, что файл UTF-8, однако. Это может быть простой ASCII или кодирование с помощью какой-либо другой схемы UnBCode DBCS.

  • hex FEFF указывает UTF-16, big-endian (сетевой порядок байтов).

  • hex FFFE указывает UTF-16, little-endian.
  • hex 0000FEFF указывает UTF-32, big-endian (сетевой порядок байтов).
  • hex FFFE0000 указывает UTF-32, малое число.

  • и т.д. См. http://en.wikipedia.org/wiki/Byte_order_mark#Representations_of_byte_order_marks_by_encoding для получения дополнительной информации.

Возможно, вы заметили, что это не безупречно. Малоконечный, кодирующий UTF-16 файл будет трудно отличить от малознакованного, кодированного UTF-32 файла ... , если это первый символ не-BOM Unicode, был ascii NUL (U + 0000).

+0

Спасибо. Его много хорошей информации. Я пройду через это. Была ли вторая часть после того, как она должна указать кодировку файла следующим образом: 'или этот двоеточие означает период? – Zuzlx

Смежные вопросы