|
Запись в текстовой файл - не догоняю с кодировками.
|
|||
---|---|---|---|
#18+
Дописываю текст в текстовой файл: Код: vbnet 1. 2. 3. 4. 5. 6. 7.
Если файла "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.
2.В этом случае русский текст пишется иероглифами, формат файла при этом так понимаю остается ANSI. Как сделать так, что если файл имеется и "старого образца", то новый код и продолжал писать его в ANSI? М.б. конечно перебираю, но тем не менее. У меня здесь определенные сложности как бы есть. Ранее я строго использовал ANSI, в .Net я насколько это возможно стараюсь контролировать чтоб "везде был Юникод". ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2015, 13:21 |
|
Запись в текстовой файл - не догоняю с кодировками.
|
|||
---|---|---|---|
#18+
1. А что написано в Remarks к этому конструктору? 2. Нужно понимать, как текстовый редактор вычисляет.подбирает кодировку... Поищите сами... но вот - вариант ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2015, 13:30 |
|
Запись в текстовой файл - не догоняю с кодировками.
|
|||
---|---|---|---|
#18+
Дмитрий77, Для того, чтобы однозначно определить в какой кодировке пишется текстовый файл, добавляется специальный маркер . Если этого не сделать, то тогда однозначно определить кодировку нельзя, только с помощью эвристического анализа. Так что так просто решить задачу писать в файл в той кодировке, в которой туда были записаны данные без маркера — никак. Либо сразу всегда писать UTF-8, либо писать в файл маркер, либо стучать в бубен. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2015, 13:36 |
|
Запись в текстовой файл - не догоняю с кодировками.
|
|||
---|---|---|---|
#18+
Дмитрий77 Как сделать так, что если файл имеется и "старого образца", то новый код и продолжал писать его в ANSI? явно указать кодировку. да и что понимать под "ANSI" ? CP-1251,CP-1252 ? Распознавание кодировки - если есть маркер BOM - 0xEF,0xBB,0xBF для UTF-8 - хорошо. Если нет - эвристический анализ ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2015, 13:37 |
|
Запись в текстовой файл - не догоняю с кодировками.
|
|||
---|---|---|---|
#18+
Дмитрий77, А для ANSI существуют для русского языка как минимум 2 кодировки: это CP 1251 и OEM 866, что ещё больше усложняет задачу. Поэтому желательно всегда работать с UTF-8. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2015, 13:38 |
|
Запись в текстовой файл - не догоняю с кодировками.
|
|||
---|---|---|---|
#18+
Дмитрий77, То есть, (в свете вышесказанного) если уж вы дошли до какого-то файла - читайте его как есть, а пишите в КОИ-8. Нет смысла сохранять старый формат - прочитать его и так кто угодно прочитает. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2015, 13:45 |
|
Запись в текстовой файл - не догоняю с кодировками.
|
|||
---|---|---|---|
#18+
D129а пишите в КОИ-8. :-) UTF-8 ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2015, 13:46 |
|
Запись в текстовой файл - не догоняю с кодировками.
|
|||
---|---|---|---|
#18+
D129КОИ-8. а вот этого не надо ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2015, 13:47 |
|
Запись в текстовой файл - не догоняю с кодировками.
|
|||
---|---|---|---|
#18+
buser1. А что написано в Remarks к этому конструктору? StreamWriter Constructor (String, Boolean) ? Написано:with UTF-8 encoding without a Byte-Order Mark (BOM) то бишь без маркера Ладно, устраивает. >да и что понимать под "ANSI" ? CP-1251,CP-1252 ? любые мои старые коды предполагают дефолтную системную (язык системы для не-Юникод программ), т.е. на русской очевидно 1251 по дефолту >явно указать кодировку только я не знаю "старый" или "новый" файл там лежит. Продолжать эксплуатировать дефолтный ANSI не есть гуд. >эвристический анализ Ну я понял что никак. Эвристический дурдом разводить не хочу и не буду. Опасения связаны с возникновением ситуации, когда у юзера по каким-то любым причинам оказался некий "файл из старой версии" и новый код не сможет с ним нормально работать. Хорошо если логи, хуже если какие-нибудь данные. Ладно, забью пока. Буду по ходу смотреть на частные случаи, типа во что они могут вылиться. Если файлы важные, то наверно конвертировать при апгрейде, если не важные - удалять. Только так наверно. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2015, 14:04 |
|
Запись в текстовой файл - не догоняю с кодировками.
|
|||
---|---|---|---|
#18+
D129Дмитрий77, То есть, (в свете вышесказанного) если уж вы дошли до какого-то файла - читайте его как есть, а пишите в UTF-8. Нет смысла сохранять старый формат - прочитать его и так кто угодно прочитает. :-) Да я не против "пишите в UTF-8". Только при дозаписи в старый файл кодом из первого поста файл не начинает восприниматься как UTF-8 (при открытии в блокноте например). ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2015, 14:12 |
|
Запись в текстовой файл - не догоняю с кодировками.
|
|||
---|---|---|---|
#18+
Дмитрий77Ладно, забью пока. Буду по ходу смотреть на частные случаи, типа во что они могут вылиться. Если файлы важные, то наверно конвертировать при апгрейде, если не важные - удалять. Только так наверно. Следующий код добавляет маркер автоматически при создании файла: Код: c# 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2015, 14:17 |
|
Запись в текстовой файл - не догоняю с кодировками.
|
|||
---|---|---|---|
#18+
Дмитрий77Да я не против "пишите в UTF-8". Только при дозаписи в старый файл кодом из первого поста файл не начинает восприниматься как UTF-8 (при открытии в блокноте например). Можно проверять наличие BOM и добавлять его, перезаписывая файл. Я думаю это надо сделать, если хочется, чтобы потом файл нормально открывался в Notepad.exe ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2015, 14:19 |
|
Запись в текстовой файл - не догоняю с кодировками.
|
|||
---|---|---|---|
#18+
Дмитрий77Только при дозаписи в старый файл кодом из первого поста файл не начинает восприниматься как UTF-8 (при открытии в блокноте например). Не, не совсем так. Если в "старом файле" присутствовал русский текст (НЕюникодный) - хоть одно слово в любом месте, то новозаписанный UTF-8 не читается. А вот если в "старом файле" только English - то новозаписанный UTF-8 прекрасно читается. Походу это блокнот "эвристический анализ" делает. Забивать короче на это надо. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2015, 14:23 |
|
Запись в текстовой файл - не догоняю с кодировками.
|
|||
---|---|---|---|
#18+
Дмитрий77Походу это блокнот "эвристический анализ" делает. Забивать короче на это надо. Есть уже готовый детектор https://www.nuget.org/packages/UDE.CSharp ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2015, 14:29 |
|
Запись в текстовой файл - не догоняю с кодировками.
|
|||
---|---|---|---|
#18+
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.
Оно конечно BOM не запишет, если его там нет, но по крайней мере все новые файлы будут с этим BOM. Есть смысл? Или забить? Там про какие-то exception-ы сказано Так понимаю если BOM указан а в содержании вдруг ахинея несоответствующая этому BOM, то будут лететь ошибки, не могу сказать что я эти exception-ы сильно жду и буду им рад. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2015, 14:44 |
|
Запись в текстовой файл - не догоняю с кодировками.
|
|||
---|---|---|---|
#18+
Дмитрий77Оно конечно BOM не запишет, если его там нет, но по крайней мере все новые файлы будут с этим BOM. Есть смысл? Или забить? Есть смысл. Подход верный. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2015, 15:06 |
|
Запись в текстовой файл - не догоняю с кодировками.
|
|||
---|---|---|---|
#18+
Дмитрий77Там про какие-то exception-ы сказано Так понимаю если BOM указан а в содержании вдруг ахинея несоответствующая этому BOM, то будут лететь ошибки, не могу сказать что я эти exception-ы сильно жду и буду им рад. Ошибок не будет. Просто надо принять как факт, что UTF-8 это основная кодировка. И стараться никаких других не использовать. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2015, 15:07 |
|
Запись в текстовой файл - не догоняю с кодировками.
|
|||
---|---|---|---|
#18+
Дмитрий77Не кажется ли, что слишком большие издержки каждый раз проверять BOM из-за предположения, что вдруг там сидит "файл старого образца", вероятность чего крайне низка и этот BOM сработает лишь однажды (если этот файл там вообще был)? Эти издержки, кстати, минимальны. Проверить 3 байта в начале файла, это ни на что не повлияет. Надо считать первые 3 символа и сравнить их с System.Text.Encoding.UTF8.GetPreambule(). Если всё верно, переместиться в конец и дописывать файл. Если нет, то считать всё содержимое файла в память, удалить файл, создать заново и записать содержимое из памяти, BOM добавится автоматически. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2015, 15:09 |
|
Запись в текстовой файл - не догоняю с кодировками.
|
|||
---|---|---|---|
#18+
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 байта в виде я== Шутка. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2015, 15:48 |
|
Запись в текстовой файл - не догоняю с кодировками.
|
|||
---|---|---|---|
#18+
Дмитрий77Открываю этот UTF-8 старым добрым Far-ом, а там х***я какая-то Shift-F8 6 ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2015, 16:15 |
|
Запись в текстовой файл - не догоняю с кодировками.
|
|||
---|---|---|---|
#18+
Изопропил, У меня Far наверно старый v.1.70 Нету там UTF-8. Я когда систему менял, пытался "новый" 64-битный поставить, но там такая глюкотень, что обплевавшись поставил 32-битную проверенную версию от оригинального автора. Да ладно, блокнота для просмотра достаточно. А байты смотреть/править я hiew.exe пользую (спасибо автору что хоть поддерживает). ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2015, 16:36 |
|
Запись в текстовой файл - не догоняю с кодировками.
|
|||
---|---|---|---|
#18+
Дмитрий77, Far Manager, version 3.0 (build 2942) x64 Copyright © 1996-2000 Eugene Roshal, Copyright © 2000-2012 Far Group и автор оригинальный и глюкотени никакой ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2015, 18:37 |
|
Запись в текстовой файл - не догоняю с кодировками.
|
|||
---|---|---|---|
#18+
Изопропил, Far Manager, version 3.0 (build 3900) x64 Copyright © 1996-2000 Eugene Roshal, Copyright © 2000-2014 Far Group ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2015, 18:51 |
|
Запись в текстовой файл - не догоняю с кодировками.
|
|||
---|---|---|---|
#18+
Изопропил, вспомнил в чем там глюкотень была. У меня Far под Norton Commander подстроен. Плюс какие-то свои фишки-менюшки. И все это сохранено в reg-файле сто лет назад. Т.е. помимо установки я щелкаю по этому reg-файлу. И то ли в 64-битном ветка реестра не совпадает (sysWow64 и т.п.) то ли в новой версии настройки вообще по другому хранятся. В настройки потыкался, тоже чего-то изменилось. Плюс до кучи какие-то шрифты привычные приятные глазу не встали. В общем плюнул и поставил к чему привык. Чтоб по файлам и по FTP лазить мне старого достаточно. А редактором я если и пользуюсь, то только для совсем старых DOS-текстов, да и не надо это уже последнее время. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2015, 18:58 |
|
Запись в текстовой файл - не догоняю с кодировками.
|
|||
---|---|---|---|
#18+
авторыCopyright © 1996-2000 Eugene Roshal, Copyright © 2000-2014 Far Group Да ни хрена он не Copyright. Насколько я понял, касательно крайних версий, его вообще в OpenSource превратили, при этом напичкали кучу "As Is" все кому не лень, вот оно и стало "As Is". ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2015, 19:03 |
|
|
start [/forum/topic.php?fid=20&msg=38851748&tid=1402038]: |
0ms |
get settings: |
6ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
40ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
65ms |
get tp. blocked users: |
2ms |
others: | 13ms |
total: | 161ms |
0 / 0 |