purebasic.info

PureBasic forum
Текущее время: Ср сен 26, 2018 4:10 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 17 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: #PB_UTF16
СообщениеДобавлено: Пт мар 23, 2018 2:19 pm 
Не в сети
профессор

Зарегистрирован: Сб фев 06, 2016 6:18 pm
Сообщений: 271
Благодарил (а): 14 раз.
Поблагодарили: 32 раз.
Пункты репутации: 0
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
OpenFile(0, "TEST_.txt") ;  Строка для теста. ,,, 345.
length.i = Lof(0)
*mem = AllocateMemory(length+1)
ReadData(0, *mem, length)
 
For i = 0 To length -1
  Ascii .a = PeekA(*mem+i)
  String.s + PeekS(@Ascii, -1, #PB_UTF16)
Next i
 
Debug String
CloseFile(0)
FreeMemory(*mem)



Debug = Ñòðîêà äëÿ òåñòà. ,,, 345.
Открываю файл в WinHex - "Unicode UTF-16 LE" и нате вам квадратики, а в "Unicode UTF-7" Ñòðîêà äëÿ òåñòà. ,,, 345.
:? Кто-то из нас троих чудит не по-детски.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: #PB_UTF16
СообщениеДобавлено: Пт мар 23, 2018 2:30 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 25, 2009 1:02 pm
Сообщений: 2285
Откуда: Russia — Belarus
Благодарил (а): 6 раз.
Поблагодарили: 72 раз.
Пункты репутации: 11
Смотри ReadStringFormat(). Там написано, что:
The #PB_Ascii, #PB_UTF8 and #PB_Unicode results may be used directly in further calls to ReadString() to read the file. The other results represent string formats that cannot be directly read with PureBasic string functions. They are included for completeness so that an application can display a proper error-message.

Т.е. форматы отличные от ASCII, UTF8, UNICODE — не поддерживаются в PB.

Код:
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
#file_txt = 0
 
Procedure.i TestForBOM(fileID.i)
  Protected result.i = ReadStringFormat(fileID)
  Select result
    Case #PB_Ascii
      Debug "Ascii file, no BOM detected."
    Case #PB_Unicode
      Debug "Unicode file, UTF-16 (little endian) BOM detected."
    Case #PB_UTF8
      Debug "UTF-8 file, UTF-8 BOM detected."
    Case #PB_UTF16BE, #PB_UTF32, #PB_UTF32BE
      Debug "File is not in a supported format, a non-PB BOM string format detected."
      result = #PB_Ascii ;use this for all non-standard types
  EndSelect
  ProcedureReturn result
EndProcedure
 
If ReadFile(#file_txt, "C:\1.txt")
  Define stringFormat.i = TestForBOM(#file_txt)
  While Eof(#file_txt) = 0
    Define current_string.s = ReadString(#file_txt, stringFormat)
    Debug current_string
  Wend
  CloseFile(#file_txt)
Else
  Debug "Can not read file!"
EndIf


_________________
EnableExplicit User


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: #PB_UTF16
СообщениеДобавлено: Пт мар 23, 2018 3:23 pm 
Не в сети
профессор

Зарегистрирован: Сб фев 06, 2016 6:18 pm
Сообщений: 271
Благодарил (а): 14 раз.
Поблагодарили: 32 раз.
Пункты репутации: 0
Да вроде не выхожу за возможности PB. Строку сохраняю как 1251 (ANSI - кириллица). Может дело в PeekA, то есть пытаюсь 1 байт прочитать ка 2 (UTF16). Как перешел на PB 5.62 то аж присох.

Немного подумав:

Если использовать PeekU вместо PeekA то, квадратики уже похожи на WinHe'ховские :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: #PB_UTF16
СообщениеДобавлено: Пт мар 23, 2018 7:31 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1695
Откуда: Алматы
Благодарил (а): 15 раз.
Поблагодарили: 46 раз.
Пункты репутации: 5
это случай где данные задом наперед записаны чтоль? если да - Пётр давал такую читалку :)

Код:
1
2
3
4
5
Procedure.u ReadBE16(File.l) ; Read a Big-Endian 16-bit (swap byte order)
  Result.u = ReadAsciiCharacter(File) << 8
  Result.u | ReadAsciiCharacter(File)
  ProcedureReturn (Result)
EndProcedure



хм... а вот писать я что-то не уверен что Пётр давал. по моему я делал и по ходу это не верно:
Код:
1
2
3
4
Procedure WriteBE16(File.l, Value.u)
  WriteByte(File, (Value >> 8))
  WriteByte(File, (Value & $FF))
EndProcedure


а не должно быть вместо WriteByte - WriteAsciiCharacter?

и наоборот при чтение в .w тип:
Код:
1
2
3
4
5
Procedure.w ReadBE16W(File.l) ; Read a Big-Endian 16-bit (swap byte order)
  Result.w = ReadAsciiCharacter(File) << 8
  Result.w | ReadAsciiCharacter(File)
  ProcedureReturn (Result)
EndProcedure


ReadAsciiCharacter использован верно? или надо было ReadByte использовать?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: #PB_UTF16
СообщениеДобавлено: Пт мар 23, 2018 9:01 pm 
Не в сети
профессор

Зарегистрирован: Сб фев 06, 2016 6:18 pm
Сообщений: 271
Благодарил (а): 14 раз.
Поблагодарили: 32 раз.
Пункты репутации: 0
SereZa писал(а):
это случай где данные задом наперед записаны чтоль?

Я так запутался, что сам не знаю, что хотел спросить. Кажется, хотел вывести на экран данные отображенные MapViewOfFile в формате utf-8 и utf-16. ReadData здесь чисто для примера. Вот так с WinHex схожесть есть:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
OpenFile(0, "TEST_.txt") ;  Строка для теста. ,,, 345.
length.i = Lof(0)
*mem = AllocateMemory(length+1)
ReadData(0, *mem, length)
 
For i = 0 To length -1
  Ascii.u = PeekU(*mem+i)
  String.s + PeekS(@Ascii, 1, #PB_UTF8)
Next i
 
Debug String
CloseFile(0)
FreeMemory(*mem)

Но это с символами ascii, юникодные символы будет резать? С -1 строку двоит " .. ,,,,,, 334455..". :(


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: #PB_UTF16
СообщениеДобавлено: Пт мар 23, 2018 9:15 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6382
Благодарил (а): 20 раз.
Поблагодарили: 198 раз.
Пункты репутации: 48
SereZa писал(а):
это случай где данные задом наперед записаны чтоль? если да - Пётр давал такую читалку :)

kenmo с буржуйского форума это что ли Пётр? Не знал :D
Изображение

_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: #PB_UTF16
СообщениеДобавлено: Пт мар 23, 2018 9:39 pm 
Не в сети
профессор

Зарегистрирован: Сб фев 06, 2016 6:18 pm
Сообщений: 271
Благодарил (а): 14 раз.
Поблагодарили: 32 раз.
Пункты репутации: 0
Хотя, StringByteLength(Chr(49)) = 2 байта :? Значит должно работать и с PeekA :roll:


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: #PB_UTF16
СообщениеДобавлено: Пт мар 23, 2018 10:03 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11260
Благодарил (а): 4 раз.
Поблагодарили: 431 раз.
repeat писал(а):
Открываю файл в WinHex - "Unicode UTF-16 LE"
repeat писал(а):
Строку сохраняю как 1251 (ANSI - кириллица).
В какой кодировке файл? Нужно его прикрепить к сообщению, чтобы посмотреть.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: #PB_UTF16
СообщениеДобавлено: Пт мар 23, 2018 10:51 pm 
Не в сети
профессор

Зарегистрирован: Сб фев 06, 2016 6:18 pm
Сообщений: 271
Благодарил (а): 14 раз.
Поблагодарили: 32 раз.
Пункты репутации: 0
Пётр, в данном случае непонятно с utf-16, вот что получаю - "Ñòðîêà äëÿ òåñòà. ,,, 345."
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
OpenFile(0, "TEST_.txt") ;  Строка для теста. ,,, 345.
length.i = Lof(0)
*mem = AllocateMemory(length+1)
ReadData(0, *mem, length)
 
For i = 0 To length -1
  Ascii.a = PeekA(*mem+i)
  String.s + PeekS(@Ascii, -1, #PB_UTF16)
Next i
 
Debug String
CloseFile(0)
FreeMemory(*mem)


Этот же файл в WinHex, в формате utf-16 дает сплошные квадратики, а результат аналогичный моему коду можно получить от WinHex установив формат utf-7.


Вложения:
Комментарий к файлу: My code
2.jpeg [73.71 KiB]
Скачиваний: 0
Комментарий к файлу: WinHex
1.jpeg [26.06 KiB]
Скачиваний: 0
TEST_.txt [26 байт]
Скачиваний: 45
Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: #PB_UTF16
СообщениеДобавлено: Пт мар 23, 2018 11:08 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 575
Благодарил (а): 2 раз.
Поблагодарили: 32 раз.
Пункты репутации: 9
repeat писал(а):
Пётр, в данном случае непонятно с utf-16, вот что получаю - "Ñòðîêà äëÿ òåñòà. ,,, 345."
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
OpenFile(0, "TEST_.txt") ;  Строка для теста. ,,, 345.
length.i = Lof(0)
*mem = AllocateMemory(length+1)
ReadData(0, *mem, length)
 
For i = 0 To length -1
  Ascii.u = PeekA(*mem+i)
  String.s + PeekS(@Ascii, -1, #PB_UTF16)
Next i
 
Debug String
CloseFile(0)
FreeMemory(*mem)


Этот же файл в WinHex, в формате utf-16 дает сплошные квадратики, а результат аналогичный моему коду можно получить от WinHex установив формат utf-7.

А что вы должны получить беря один байт PeekA(*mem+i),если UTF-16(без суррогатов) как минимум 2 байта?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: #PB_UTF16
СообщениеДобавлено: Пт мар 23, 2018 11:20 pm 
Не в сети
профессор

Зарегистрирован: Сб фев 06, 2016 6:18 pm
Сообщений: 271
Благодарил (а): 14 раз.
Поблагодарили: 32 раз.
Пункты репутации: 0
Сергейчик, согласен, но с PeekC для Ascii так же будет 2 байта, от этого:
repeat писал(а):
строку двоит " .. ,,,,,, 334455..". :(


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: #PB_UTF16
СообщениеДобавлено: Пт мар 23, 2018 11:24 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 575
Благодарил (а): 2 раз.
Поблагодарили: 32 раз.
Пункты репутации: 9
А так?
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
OpenFile(0, "TEST_.txt") ;  Строка для теста. ,,, 345.
length.i = Lof(0)
*mem = AllocateMemory(length+1)
ReadData(0, *mem, length)
 
For i = 0 To length -1 step 2
  String.s + PeekS(*mem+i, 2, #PB_UTF16)
Next i
 
Debug String
CloseFile(0)
FreeMemory(*mem)
 


или тупо без цикла
Код:
1
2
3
 
String.s = PeekS(*mem, -1, #PB_UTF16)
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: #PB_UTF16
СообщениеДобавлено: Пт мар 23, 2018 11:28 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 575
Благодарил (а): 2 раз.
Поблагодарили: 32 раз.
Пункты репутации: 9
repeat писал(а):
Сергейчик, согласен, но с PeekC для Ascii так же будет 2 байта, от этого:
repeat писал(а):
строку двоит " .. ,,,,,, 334455..". :(

Так что надо то,для проги с кодировкой в asci,читать Utf-16 что ли ?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: #PB_UTF16
СообщениеДобавлено: Пт мар 23, 2018 11:44 pm 
Не в сети
профессор

Зарегистрирован: Сб фев 06, 2016 6:18 pm
Сообщений: 271
Благодарил (а): 14 раз.
Поблагодарили: 32 раз.
Пункты репутации: 0
Почти то что нужно, про Step совсем не подумал. Но все равно с WinHex есть некоторые разногласия. Например $CC у WinHex (c utf-16) не отображается а у меня вылазит "Ì" и т.п. Ну явно что-то у PB не то с юникодом, а может и у меня :?
Сергейчик писал(а):
для проги с кодировкой в asci,читать Utf-16 что ли ?
Программа у меня юникодная.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: #PB_UTF16
СообщениеДобавлено: Пт мар 23, 2018 11:57 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 575
Благодарил (а): 2 раз.
Поблагодарили: 32 раз.
Пункты репутации: 9
repeat писал(а):
Почти то что нужно, про Step совсем не подумал. Но все равно с WinHex есть некоторые разногласия. Например $CC у WinHex (c utf-16) не отображается а у меня вылазит "Ì" и т.п. Ну явно что-то у PB не то с юникодом, а может и у меня :?
Сергейчик писал(а):
для проги с кодировкой в asci,читать Utf-16 что ли ?
Программа у меня юникодная.

Просто у пурика младший байт отображается,все значения до 255(открой в нём таблицу ascii) а WinHex видимо только asci символы до 127 а остальные пропускает(и типа точек ставит на этот символ)? :roll:
PS: WinHex читает байты скорее не как UTF-16 а как один байт ascii до 127(без расширенных символов до 255)
Если делаешь HEX редактор то для отображения байт в виде строки с символами делай универсальность как ascii,utf-16,кои-7,кои-8,и т.д.на выбор :D
Если твоя программа юникодная то чтобы читать байты как ascii нужно к взятому одному байту добавить старший нулевой байт(для вывода на экран как utf-16)соответственно можешь отображать полностью байт до 255 или ставить точки на управляющие и расширенные символы,(управляющие по желанию в виде мнемоники HULL,SON,EOF) :wink:


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 17 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: Bing [Bot] и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB