Запись текстового файла из VB.NET (кодировка)

Я пишу приложение, которое должно генерировать простой текстовый файл со столбцами фиксированного размера.

Мой текущий код:

Dim MyFilePath As String = Path & FILE_PREFIX & FileNr & ".TXT"

IO.File.Delete(MyFilePath)

Dim FileStr As New IO.StreamWriter(MyFilePath, False, <ENCODER HERE>)
Do While r.Read
    FileStr.WriteLine(r("TXTLine"))
Loop
FileStr.Close()
r.Close()

Моя проблема в том, что у меня есть некоторые специальные символы, такие как: «ñ», «à» и т. д., и я не могу найти правильную кодировку.

  • Если я использую значение по умолчанию, то оно заменяет «ñ» двумя символами.
  • Если я использую ASCII, то все специальные символы заканчиваются как: "?"
  • Если я использую UTF-8, тогда весь текст в порядке, но он добавляет "ÿ " в первом байте файла.

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

Что я мог сделать?


person Burnsys    schedule 21.08.2009    source источник
comment
ÿ - это [Знак порядка байтов][1]... Чем вы открываете файлы? [1]: en.wikipedia.org/wiki/Byte-order_mark   -  person Breakthrough    schedule 21.08.2009


Ответы (3)


Как вы проверяете, что вы получили правильную кодировку?

Если вы просто открываете файл в Блокноте, Windows-1252, вероятно, является кодировкой, которую вы хотите.

Encoding.GetEncoding("Windows-1252")

даст вам это.

Обратите внимание: я заметил, что вы говорите, что некоторые столбцы имеют фиксированную длину. Вы записываете данные в файл для импорта другим инструментом? Если это так, то вам следует проверить, какая кодировка требуется для этого другого инструмента, а не какой инструмент выглядит красиво в любом другом инструменте, который вы можете использовать для просмотра файла (например, Блокнот).

person Lasse V. Karlsen    schedule 21.08.2009
comment
Файл будет прочитан сторонним приложением, к которому у меня нет доступа. Я просматриваю файл с помощью V.exe (HEX Viewer), и мне просто нужно, чтобы он был совместим с этим: asciitable.com. Это означает, что Ñ равно Dec: 164 или HEX: F1. - person Burnsys; 21.08.2009
comment
Если вы просто открываете файл в блокноте, возможно, вам нужна кодировка Windows-1252. Верно, если вы находитесь в США или Западной Европе, но не обязательно верно для остального мира. Конечно, эти люди, как правило, лучше разбираются в кодировках, поэтому дать разумный совет. - person MarkJ; 23.08.2009

Проблема не в том, что вы не можете найти правильную кодировку, проблема в том, что вы не знаете, какая у вас кодировка ИСТОЧНИКА. Обычный ASCII действительно имеет только 256 символов, и если ваш источник содержит символы с диакритическими знаками, которых нет в палитре ASCII, вы не сможете записать их в кодировке ASCII. Конец истории.

Что вам нужно сделать, так это пересмотреть связь между двумя системами. Если вам нужны символы Юникода, то и источник, и место назначения должны будут принимать Юникод, будь то в плоском файле или в каком-либо XML-документе.

Вы не можете поместить квадратный штифт (символы с диакритическими знаками Unicode) в круглое отверстие (файл ASCII).

person hova    schedule 21.08.2009
comment
Можно, если площадь квадрата равна площади круга, умноженной на 2/пи. ;) - person Russ Bradberry; 21.08.2009

Подождите, вы говорите, что столбцы должны быть «фиксированной длины». Это говорит о том, что вы пытаетесь прочитать этот файл другим приложением — вы вообще уверены, что это второе приложение может прочитать «специальный» (Юникод) символов?

Вы уверены, что другое приложение не ожидает только ASCII, а просто имеет определенную кодовую страницу который обрабатывает некоторые из этих специальных символов, используя совершенно другие числа (интерпретирует символы старшего бита ASCII на каком-то местном языке)?

person David    schedule 21.08.2009