powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Запись в текстовой файл - не догоняю с кодировками.
25 сообщений из 29, страница 1 из 2
Запись в текстовой файл - не догоняю с кодировками.
    #38851588
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дописываю текст в текстовой файл:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
  Public Sub AddLog(ByVal str As String)
      Using file As System.IO.StreamWriter = _
       New System.IO.StreamWriter("filename.txt", True)
        file.WriteLine(str)
      End Using
    End If
  End Sub


Если файла "filename.txt" изначально не было, то насколько я понимаю он по дефолту (без 3-го параметра в StreamWriter) пишется в UTF-8, что в принципе устраивает.

1. Действительно ли в UTF-8? Просто открываю в блокноте - если в файле есть хоть одно русское слово, то при нажатии на "Сохранить как" по дефолту предлагает "UTF-8", если ни одного русского слова - то по дефолту предлагает "ANSI". Но дозапись русского текста в этом случае не глючит.


Но предположим дозапись идет в уже существующий "filename.txt", который изначально записывался в ANSI из VB6 кодом вида:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Sub SaveText(Path As String, Optional Append As Integer)
  'Сохраняем текст коллекции как файл
  'path - имя файла в который сохраняем текст
  'Если параметр Append=1 тогда информация будет 'добавлена в конец существующего файла,
  'иначе ранее хранившаяся информация будет стерта
  Dim FileHandle As Integer
  Dim varElement As Variant
  FileHandle = FreeFile
  If Append = 1 Then
    Open Path For Append As #FileHandle
    For Each varElement In cText
      Print #FileHandle, varElement
    Next
    Close #FileHandle
  Else
    Open Path For Output As #FileHandle
    For Each varElement In cText
      Print #FileHandle, varElement
    Next
    Close #FileHandle
  End If
End Sub



2.В этом случае русский текст пишется иероглифами, формат файла при этом так понимаю остается ANSI.
Как сделать так, что если файл имеется и "старого образца", то новый код и продолжал писать его в ANSI?


М.б. конечно перебираю, но тем не менее.
У меня здесь определенные сложности как бы есть.
Ранее я строго использовал ANSI,
в .Net я насколько это возможно стараюсь контролировать чтоб "везде был Юникод".
...
Рейтинг: 0 / 0
Запись в текстовой файл - не догоняю с кодировками.
    #38851600
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. А что написано в Remarks к этому конструктору?
2. Нужно понимать, как текстовый редактор вычисляет.подбирает кодировку... Поищите сами... но вот - вариант
...
Рейтинг: 0 / 0
Запись в текстовой файл - не догоняю с кодировками.
    #38851605
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

Для того, чтобы однозначно определить в какой кодировке пишется текстовый файл, добавляется специальный маркер . Если этого не сделать, то тогда однозначно определить кодировку нельзя, только с помощью эвристического анализа. Так что так просто решить задачу писать в файл в той кодировке, в которой туда были записаны данные без маркера — никак. Либо сразу всегда писать UTF-8, либо писать в файл маркер, либо стучать в бубен.
...
Рейтинг: 0 / 0
Запись в текстовой файл - не догоняю с кодировками.
    #38851606
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77 Как сделать так, что если файл имеется и "старого образца", то новый код и продолжал писать его в ANSI?
явно указать кодировку. да и что понимать под "ANSI" ? CP-1251,CP-1252 ?

Распознавание кодировки - если есть маркер BOM - 0xEF,0xBB,0xBF для UTF-8 - хорошо.
Если нет - эвристический анализ
...
Рейтинг: 0 / 0
Запись в текстовой файл - не догоняю с кодировками.
    #38851607
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

А для ANSI существуют для русского языка как минимум 2 кодировки: это CP 1251 и OEM 866, что ещё больше усложняет задачу. Поэтому желательно всегда работать с UTF-8.
...
Рейтинг: 0 / 0
Запись в текстовой файл - не догоняю с кодировками.
    #38851615
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

То есть, (в свете вышесказанного) если уж вы дошли до какого-то файла - читайте его как есть, а пишите в КОИ-8.

Нет смысла сохранять старый формат - прочитать его и так кто угодно прочитает.
:-)
...
Рейтинг: 0 / 0
Запись в текстовой файл - не догоняю с кодировками.
    #38851617
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D129а пишите в КОИ-8.

:-)

UTF-8
...
Рейтинг: 0 / 0
Запись в текстовой файл - не догоняю с кодировками.
    #38851619
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D129КОИ-8.
а вот этого не надо
...
Рейтинг: 0 / 0
Запись в текстовой файл - не догоняю с кодировками.
    #38851635
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buser1. А что написано в Remarks к этому конструктору?
StreamWriter Constructor (String, Boolean) ?
Написано:with UTF-8 encoding without a Byte-Order Mark (BOM) то бишь без маркера
Ладно, устраивает.

>да и что понимать под "ANSI" ? CP-1251,CP-1252 ?
любые мои старые коды предполагают дефолтную системную (язык системы для не-Юникод программ),
т.е. на русской очевидно 1251 по дефолту

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

>эвристический анализ
Ну я понял что никак. Эвристический дурдом разводить не хочу и не буду.

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

Ладно, забью пока. Буду по ходу смотреть на частные случаи, типа во что они могут вылиться. Если файлы важные, то наверно конвертировать при апгрейде, если не важные - удалять. Только так наверно.
...
Рейтинг: 0 / 0
Запись в текстовой файл - не догоняю с кодировками.
    #38851640
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D129Дмитрий77,

То есть, (в свете вышесказанного) если уж вы дошли до какого-то файла - читайте его как есть, а пишите в UTF-8.

Нет смысла сохранять старый формат - прочитать его и так кто угодно прочитает.
:-)

Да я не против "пишите в UTF-8". Только при дозаписи в старый файл кодом из первого поста файл не начинает восприниматься как UTF-8 (при открытии в блокноте например).
...
Рейтинг: 0 / 0
Запись в текстовой файл - не догоняю с кодировками.
    #38851643
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Ладно, забью пока. Буду по ходу смотреть на частные случаи, типа во что они могут вылиться. Если файлы важные, то наверно конвертировать при апгрейде, если не важные - удалять. Только так наверно.

Следующий код добавляет маркер автоматически при создании файла:

Код: c#
1.
2.
3.
4.
5.
        using (Stream stream = File.OpenWrite(bomtxt))
        using (var writer = new StreamWriter(stream, new UTF8Encoding(true)))
        {
            writer.WriteLine("HelloПривет");
        }
...
Рейтинг: 0 / 0
Запись в текстовой файл - не догоняю с кодировками.
    #38851644
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Да я не против "пишите в UTF-8". Только при дозаписи в старый файл кодом из первого поста файл не начинает восприниматься как UTF-8 (при открытии в блокноте например).

Можно проверять наличие BOM и добавлять его, перезаписывая файл. Я думаю это надо сделать, если хочется, чтобы потом файл нормально открывался в Notepad.exe
...
Рейтинг: 0 / 0
Запись в текстовой файл - не догоняю с кодировками.
    #38851646
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Только при дозаписи в старый файл кодом из первого поста файл не начинает восприниматься как UTF-8 (при открытии в блокноте например).
Не, не совсем так.
Если в "старом файле" присутствовал русский текст (НЕюникодный) - хоть одно слово в любом месте, то новозаписанный UTF-8 не читается.
А вот если в "старом файле" только English - то новозаписанный UTF-8 прекрасно читается.
Походу это блокнот "эвристический анализ" делает.
Забивать короче на это надо.
...
Рейтинг: 0 / 0
Запись в текстовой файл - не догоняю с кодировками.
    #38851649
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Походу это блокнот "эвристический анализ" делает.
Забивать короче на это надо.

Есть уже готовый детектор https://www.nuget.org/packages/UDE.CSharp
...
Рейтинг: 0 / 0
Запись в текстовой файл - не догоняю с кодировками.
    #38851653
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttМожно проверять наличие BOM и добавлять его, перезаписывая файл.
Вот я пишу какой-нибудь лог, вызывая ф-цию из первого поста 10-ки раз.
Не кажется ли, что слишком большие издержки каждый раз проверять BOM из-за предположения, что вдруг там сидит "файл старого образца", вероятность чего крайне низка и этот BOM сработает лишь однажды (если этот файл там вообще был)?

Но у меня другой вопрос:
StreamWriter Constructor (String, Boolean)This constructor creates a StreamWriter with UTF-8 encoding without a Byte-Order Mark (BOM), so its GetPreamble method returns an empty byte array. The default UTF-8 encoding for this constructor throws an exception on invalid bytes. This behavior is different from the behavior provided by the encoding object in the Encoding.UTF8 property. To specify a BOM and determine whether an exception is thrown on invalid bytes, use a constructor that accepts an encoding object as a parameter, such as StreamWriter(String, Boolean, Encoding).

Не лучше ли сразу принять за правило (пока немного наваял) использовать:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
  Public Sub AddLog(ByVal str As String)
      Using file As System.IO.StreamWriter = _
       New System.IO.StreamWriter("filename.txt", True, System.Text.Encoding.UTF8)
        file.WriteLine(str)
      End Using
    End If
  End Sub


Оно конечно BOM не запишет, если его там нет, но по крайней мере все новые файлы будут с этим BOM.
Есть смысл? Или забить?
Там про какие-то exception-ы сказано Так понимаю если BOM указан а в содержании вдруг ахинея несоответствующая этому BOM, то будут лететь ошибки, не могу сказать что я эти exception-ы сильно жду и буду им рад.
...
Рейтинг: 0 / 0
Запись в текстовой файл - не догоняю с кодировками.
    #38851658
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Оно конечно BOM не запишет, если его там нет, но по крайней мере все новые файлы будут с этим BOM.
Есть смысл? Или забить?

Есть смысл. Подход верный.
...
Рейтинг: 0 / 0
Запись в текстовой файл - не догоняю с кодировками.
    #38851659
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Там про какие-то exception-ы сказано Так понимаю если BOM указан а в содержании вдруг ахинея несоответствующая этому BOM, то будут лететь ошибки, не могу сказать что я эти exception-ы сильно жду и буду им рад.

Ошибок не будет. Просто надо принять как факт, что UTF-8 это основная кодировка. И стараться никаких других не использовать.
...
Рейтинг: 0 / 0
Запись в текстовой файл - не догоняю с кодировками.
    #38851660
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Не кажется ли, что слишком большие издержки каждый раз проверять BOM из-за предположения, что вдруг там сидит "файл старого образца", вероятность чего крайне низка и этот BOM сработает лишь однажды (если этот файл там вообще был)?

Эти издержки, кстати, минимальны. Проверить 3 байта в начале файла, это ни на что не повлияет. Надо считать первые 3 символа и сравнить их с System.Text.Encoding.UTF8.GetPreambule(). Если всё верно, переместиться в конец и дописывать файл. Если нет, то считать всё содержимое файла в память, удалить файл, создать заново и записать содержимое из памяти, BOM добавится автоматически.
...
Рейтинг: 0 / 0
Запись в текстовой файл - не догоняю с кодировками.
    #38851674
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

Ладно, понял. Hex-ом посмотрел. BOM это 3 байта. Для UTF8: EF-BB-BF (239-187-191)
OK.
System.Text.Encoding.UTF8 буду писать 3-м параметром, убедили.

От "издержек" пожалуй воздержусь пока.

Без BOM конечно ничего не скажешь про старый-новый. Тупой неопознанный набор байтов.

>Просто надо принять как факт, что UTF-8 это основная кодировка.
Да... Привык я все-таки к старому доброму ANSI. Открываю этот UTF-8 старым добрым Far-ом, а там х***я какая-то. И эти самые 3 байта в виде я==
Шутка.
...
Рейтинг: 0 / 0
Запись в текстовой файл - не догоняю с кодировками.
    #38851686
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Открываю этот UTF-8 старым добрым Far-ом, а там х***я какая-то

Shift-F8 6
...
Рейтинг: 0 / 0
Запись в текстовой файл - не догоняю с кодировками.
    #38851698
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,

У меня Far наверно старый v.1.70
Нету там UTF-8.
Я когда систему менял, пытался "новый" 64-битный поставить, но там такая глюкотень, что обплевавшись поставил 32-битную проверенную версию от оригинального автора.

Да ладно, блокнота для просмотра достаточно. А байты смотреть/править я hiew.exe пользую (спасибо автору что хоть поддерживает).
...
Рейтинг: 0 / 0
Запись в текстовой файл - не догоняю с кодировками.
    #38851739
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

Far Manager, version 3.0 (build 2942) x64
Copyright © 1996-2000 Eugene Roshal, Copyright © 2000-2012 Far Group

и автор оригинальный и глюкотени никакой
...
Рейтинг: 0 / 0
Запись в текстовой файл - не догоняю с кодировками.
    #38851741
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,

Far Manager, version 3.0 (build 3900) x64
Copyright © 1996-2000 Eugene Roshal, Copyright © 2000-2014 Far Group
...
Рейтинг: 0 / 0
Запись в текстовой файл - не догоняю с кодировками.
    #38851744
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,

вспомнил в чем там глюкотень была.
У меня Far под Norton Commander подстроен.
Плюс какие-то свои фишки-менюшки.
И все это сохранено в reg-файле сто лет назад.
Т.е. помимо установки я щелкаю по этому reg-файлу.

И то ли в 64-битном ветка реестра не совпадает (sysWow64 и т.п.) то ли в новой версии настройки вообще по другому хранятся.
В настройки потыкался, тоже чего-то изменилось.

Плюс до кучи какие-то шрифты привычные приятные глазу не встали.

В общем плюнул и поставил к чему привык.
Чтоб по файлам и по FTP лазить мне старого достаточно.
А редактором я если и пользуюсь, то только для совсем старых DOS-текстов, да и не надо это уже последнее время.
...
Рейтинг: 0 / 0
Запись в текстовой файл - не догоняю с кодировками.
    #38851748
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторыCopyright © 1996-2000 Eugene Roshal, Copyright © 2000-2014 Far Group
Да ни хрена он не Copyright.
Насколько я понял, касательно крайних версий, его вообще в OpenSource превратили, при этом напичкали кучу "As Is" все кому не лень, вот оно и стало "As Is".
...
Рейтинг: 0 / 0
25 сообщений из 29, страница 1 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Запись в текстовой файл - не догоняю с кодировками.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]