|
Как определить, что кодировка txt-файл Unicode (UTF-16)
|
|||
---|---|---|---|
#18+
Всем здрасьте! Есть два txt-файла - один в ANSI кодировке, другой - в UTF-16. Первый (ANSI) открываю и читаю так Код: vbnet 1. 2. 3. 4.
Второй (UTF-16) так Код: vbnet 1. 2. 3. 4.
Вопрос: как, во время выполнения программы, определить какой из файлов Unicode (UTF-16)? Notepad же как-то "умеет" это делать! )) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.03.2015, 19:05 |
|
Как определить, что кодировка txt-файл Unicode (UTF-16)
|
|||
---|---|---|---|
#18+
Unicode (UTF-16), Обычно, так скажем как правило, вначале файла содержится заголовок из байтов: &HFF и &HFE или &HFE и &HFF, говорит что файл у нас в Unicode. Другой вариант, собрать статистику использования символов, если текст достаточный и можно догадаться что у нас Unicode (например, если текст латиницей, то каждый 2-ой байт у символа будет нулевой &H0) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.03.2015, 20:22 |
|
Как определить, что кодировка txt-файл Unicode (UTF-16)
|
|||
---|---|---|---|
#18+
Если FF, FE, то блокнот открывает. Как и без этих байтов. Если FE, FF, то нет. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.03.2015, 23:17 |
|
Как определить, что кодировка txt-файл Unicode (UTF-16)
|
|||
---|---|---|---|
#18+
VSVLAD , Спасибо! Вообщем, через анализ этого BOM пока и сделал Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24.
VSVLAD Обычно, так скажем как правило , вначале файла содержится заголовок из байтов: &HFF и &HFE или &HFE и &HFF, говорит что файл у нас в Unicode. "Попроверял" свои файлы, вроде бы, проблемы нет - у всех, первые два байта : FF FE Но вот нашёл сходную проблему и там тоже об этом пишут: авторА "фишка" вот в чем. Текстовые файлы, записанные в Unicode (точнее, в UTF-16) должны, по-хорошему, начинаться с BOM (Byte Order Mask) — двухбайтового флага, говорящего о том, как трактовать идущие за ним данные. Предполагается так же, что эти два байта навряд ли окажутся в начале ASCII файла. Однако же, не все приложения пишут BOM в начале UTF-16-файла. Так как же поступить бедному блокноту? В Windows API есть функция IsTextUnicode(), позволяющая с определенной долей вероятности узнать, в Unicode ли переданный ей текст или нет. И вот где порылась собака. Данная функция применяет эвристические алгоритмы и статистические тесты и выдает лишь свою догадку: These tests are not foolproof. The statistical tests assume certain amounts of variation between low and high bytes in a string, and some ASCII strings can slip through. For example, if lpBuffer points to the ASCII string 0x41, 0x0A, 0x0D, 0x1D (A\n\r^Z), the string passes the IS_TEXT_UNICODE_STATISTICS test, though failure would be preferable. и предлагается использовать API функцию IsTextUnicode() Код: vbnet 1.
и тут у меня уже "мозгов нехватило" )) В функцию нужно передавать строку, которая будет проверятся, но что бы передать эту строку - её нужно считать из файла, а для того, что бы считать - нужно знать "как считывать" - как ANSI или Unicode ... замкнутый круг какой-то )) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.03.2015, 23:57 |
|
Как определить, что кодировка txt-файл Unicode (UTF-16)
|
|||
---|---|---|---|
#18+
Полагаю, считывать надо в двоичном (бинарном) режиме ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2015, 01:06 |
|
Как определить, что кодировка txt-файл Unicode (UTF-16)
|
|||
---|---|---|---|
#18+
Shocker.ProПолагаю, считывать надо в двоичном (бинарном) режимеДа, считать в массив байт - не проблема, непонятно как потом этот массив передать как параметр lpBuffer As String в функцию. Но идея, в целом та. Нашёл, что есть ещё одна подобная функция (IsTextPointerUnicode), которой нужно передавать указатель на строку, вот ей можно указатель на массив байт и "подсунуть". Вот такое что-то вышло (в правильности выбора константы не очень уверен) Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38.
Все три файла отсюда 17397008 определяет как Unicode (правда u2.txt если читать через OpenTextFile(FileName2, ForReading, , TristateTrue) выводит "?") Описание констант, вдруг кому понадобится Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2015, 02:10 |
|
Как определить, что кодировка txt-файл Unicode (UTF-16)
|
|||
---|---|---|---|
#18+
Наверно лучше Код: vbnet 1.
, потому что для функции StrPtr массив будет скопирован в новую строку - лишняя операция. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2015, 10:40 |
|
Как определить, что кодировка txt-файл Unicode (UTF-16)
|
|||
---|---|---|---|
#18+
Unicode (UTF-16)Shocker.ProПолагаю, считывать надо в двоичном (бинарном) режимеДа, считать в массив байт - не проблема, непонятно как потом этот массив передать как параметр lpBuffer As String в функцию. Но идея, в целом та. Нашёл, что есть ещё одна подобная функция (IsTextPointerUnicode), которой нужно передавать указатель на строку, вот ей можно указатель на массив байт и "подсунуть". Вот такое что-то вышло (в правильности выбора константы не очень уверен) [/src] [/src][/spoiler] Добрый день! подскажите что есть результатирущим в данном примере. тоесть по какому признаку, возвращаемому значению вы определяете результат? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2015, 14:51 |
|
|
start [/forum/topic.php?fid=60&msg=38907965&tid=2155789]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
33ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 137ms |
0 / 0 |