unicode - конвертация, работа и прочее

Страница 1 из 2 1, 2  Следующий

Предыдущая тема Следующая тема Перейти вниз

unicode - конвертация, работа и прочее

Сообщение  Eric-S в Вс Авг 10, 2008 9:36 am

Подскажите пожалуйста, как работать с текстом в юникоде.

Точнее ситуация такая. Есть у меня файл, его нужно распарсить и записать.
Но вот кодировка в нём неизвестна. Точнее она известна, но только если открыть этот файл и найти соответствующий тег.

Сейчас у меня файл открываеться в binary и весь грузитьсНо кроме ascii и utf-8 может быть utf-16 и даже utf-32.

я в строку string.

Для юникода ведь нужно wstring?
Я ещё не работал с wstring, она будет обрабатываться теме же функциями что и string?

Мысль у меня такая, что нужно считать файл в массив ubyte, а потом его уже конвертнуть в wstring.
А как обратно?


Последний раз редактировалось: Eric-S (Пн Сен 29, 2008 10:12 pm), всего редактировалось 1 раз(а)

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 33
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: unicode - конвертация, работа и прочее

Сообщение  Eric-S в Пн Авг 11, 2008 10:16 am

Я нашел, что хотел о юникоде. Так и знал, что на википедии есть.
http://ru.wikipedia.org/wiki/Unicode

И пришел к выводу, что это уже полный п*ц!

Вот уроды! Так издеваться над символами. Причём, как обычно куча надстроек и поправок, без которых жилось бы спокойнее.

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

Только, как обычно никто ничего пересматривать не будет. Скажут, что типа стандарт такой уже есть и конструктивных поправок делать никто не будет. Иначе некоторые старые программы будут глючить.
А то, что молодые программеры будут глючить, им уже плевать!


Префиксы в файле, конечно есть, но они не полностью гарантируют правельную идентификацию кодировки.
Оъбясняеться это тем, что символы конечно редкоиспользуемые, но всё же используемые.

Короче намыло этот юникод! Когда не задумывался о нём, жить было легче.



Дело обстоит так:

Хоть freebasic умеет открывать и создавать файлы в разных кодировках ascii utf-8 utf-16, utf-32. Смотрите ключевое слово encoding.
Но такой документ нельзя считать стандартным.

Точнее при сохранении юникода ему нужен префикс.

ворпад сохранил utf-16 и проставил первые два байта 255, 254.

Как понимаю для него это стандартно. Точно так же как для интернет эксплорера, который прекрасно открыл этот документ.

А вот при кодинге, эти байты нужно будет ставить ручками.

Но это ещё не всё!
Кому нужно читайте на википедии, есть много ньюансов.



Накрылась моя идея побайтового чтения файла, во имя его корректного понимания.
Или всё же существует, чёткий алгоритм конвертации байтов в wstring?

Ведь таже самая utf-8 предусматривает символы длинной от 1 до 9 байт.

А может быть пойти каким-нибудь другим путём, чтобы считать содержимое?

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 33
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: unicode - конвертация, работа и прочее

Сообщение  tux в Вт Авг 12, 2008 12:22 pm

Считать содержимое не проблема, вот тока я чет недопер, зачем ето надо? Можно поподробней объяснить, что требуется
avatar
tux

Сообщения : 365
Дата регистрации : 2008-04-06
Возраст : 29
Откуда : Сибирь

Посмотреть профиль http://tux.nsk.ru/

Вернуться к началу Перейти вниз

Re: unicode - конвертация, работа и прочее

Сообщение  Eric-S в Ср Авг 13, 2008 1:41 am

Моя программа должна открыть произвольный файл. Кодировка в нём может быть тоже произвольная.
Содержимое всего файла нужно прогрузить в строку и пропарсить.


Но кодировка файла мне заранее неизвестно, так как юзер однозначно не будет её указывать специально, при запуске программы.

Зато кодировка есть в нутри файла, указана в специальном теге. Но до этого тега нужно ещё как-то добраться.

Вообще-то по умолчанию должна быть utf-16, если в теге ничего иного не сказано.

А файл нужно читать в бинарном режиме, так как важны все символы, даже переводы строк chr$(10) и chr$(13).

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 33
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: unicode - конвертация, работа и прочее

Сообщение  tux в Ср Авг 13, 2008 6:02 am

Блин, с уникодом я наверно ничего не подскажу, т.к. пока не приходилось с ним сталкиваться, а на счет считывания информации в бинарном режиме в переменную wstring врятли получится (в string точно нельзя), т.к. она не может хранить спец символы, для етого надо считывать либо побайтно (но ето будет долго), либо кусками в переменную типа zstring (соответственно создав его определенного размера), а после уже побайтно разбирать ее
avatar
tux

Сообщения : 365
Дата регистрации : 2008-04-06
Возраст : 29
Откуда : Сибирь

Посмотреть профиль http://tux.nsk.ru/

Вернуться к началу Перейти вниз

Re: unicode - конвертация, работа и прочее

Сообщение  Eric-S в Ср Авг 13, 2008 9:26 am

Ну считать для начало можно в битовый массив, это не трудно.

Дальше если это ascii, то без проблем.

Но unicode там один символ может быть от 1 до 9 байтов.
И конвертировать нужно по определённым правилам.

Хотя обычно пишут чётко символ в 2 байта.
Тогда символ будет просто конвертнуть
wchar( b(p) + 256*b(p+1) )
Но тут всё очень не однозначно.

Хотя может быть стоит попробовать ручками (прямо в памяти) переписать.

Или привести указатель на байтовый массив, как указатель на wstring.

Интересно, а как в памяти выглядит байтовый массив. В смысле он там последовательный или как?

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 33
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: unicode - конвертация, работа и прочее

Сообщение  tux в Ср Авг 13, 2008 12:52 pm

Байтовый массив обязан располагаться в памяти последовательно, и обращаться к его элементу можно через указатели, к примеру так:
Код:

dim as ubyte pVar(1 to 10)
pVar(5)=222
print *(@pVar(1)+4)
sleep
поясню (вдруг понадобится) в предпоследней строчке получаем адрес первого элемента массива (@ - аналог Си-шного &), после сдвигаемся по адресному пространству на 4 байта (тк размер переменной у нас один байт, если бы допустим был short, то бы сдвигались на 4*2), после етого получаем значение по заданному адресу (* - как в Си), скобки используются для приоритета операции
Можно сделать и немного подругому (помоему в сишке тоже чето подобное есть)
Код:

dim as ubyte pVar(1 to 10)

pVar(5)=222

print (@pVar(1))[4]
sleep
Те если в FB использовать квадратные скобки для указателя, а в них указывать смещение, то можно сразу получать значение по етому адресу (мне так даже больше нравится), плюс к етому не надо учитывать размер переменной
Также с помощю квадратных скобок можно и получать значения из строковых переменных
Код:

dim as zstring*10 pVar

pVar="ABCDEF"

print chr(pVar[3])
sleep
Аналогично и со string-ом (кстать надо учесть что отсчет идет от нуля)
А побайтово считывать, ещераз повторюсь, долго будет, лучше допустим создать буфер к примеру zstring*1024, и считывать в него несколько раз, а из него (перебирая его как массив), выбирать нужные данные.
Тока, если не ошибаюсь, компилятор последний байт етого буфера будет резервировать под символ конца строки, тк ето особенность типа переменной (опять же от Си)
avatar
tux

Сообщения : 365
Дата регистрации : 2008-04-06
Возраст : 29
Откуда : Сибирь

Посмотреть профиль http://tux.nsk.ru/

Вернуться к началу Перейти вниз

Re: unicode - конвертация, работа и прочее

Сообщение  tux в Ср Авг 13, 2008 12:58 pm

Да, кстать, предупрежу на всякий случай, работа напрямую с адресами не входило в концепцию программирования на языке Бейсика, вместо етого испольщовались обычно массивы и индексы, ето давало значительный плю в надежности программы, тк нельзя было вылезти случайно за адресное пространство программы, следовательно даже малоопытный программист мог писать достаточно надежные программы
avatar
tux

Сообщения : 365
Дата регистрации : 2008-04-06
Возраст : 29
Откуда : Сибирь

Посмотреть профиль http://tux.nsk.ru/

Вернуться к началу Перейти вниз

Re: unicode - конвертация, работа и прочее

Сообщение  Eric-S в Пт Авг 15, 2008 6:41 am

tux, благодарю за пояснения.
На счёт байтового массива я подозревал, но небыл уверен.
Кстати получается, что вообще все массивы в памяти расположены последовательно?

И ещё похоже, что квадратные скобочки, могут ускорить доступ к символам в строках?
Я даже не подозревал, о том, что такой синтаксис поддерживается.

А вот на счёт указателей я осведомлён и даже умею с ними работать во имя ускорения и извращения.


tux, вот со строками, точнее string ты ошибаешся.
(правда я не очень эксперементировал, но повсем признакам похоже, что fb сохранил хорошую традицию basic при работе со строками).


Сишному представлению строк соответствует тип zstring.
Хотя нолик chr$(0) остался и в string, но в обычных ситуациях он невидим и не влияет на работу программы.

Р
Строка (string) это переменная в переменной.

Т.е. по адресу @mystring мы получим некий набор символов.
Анологично varPtr(mystring).

А чтобы получить указатель на начало самой строчки нам нужна функция
strPtr(mystring)

В примере так даже и прописано

Код:

dim str1 as zstring ptr
dim str2 as string

str2 = "привет чуваки, это моя строчка!"
str1 = strPtr(str2)

print *str1

В памяти хранится дескриптор. В котором собственно указатель на начало строчки, а к нему длина этой самой строчки.
Этот приём позволяет нам более гибко работат со строками.
Во первых отсюда более простое изменение длины строки.
Во вторых, в строке допустимы абсолютно любые символы, в том числе chr$(0), поскольку он больше не является признаком конца строчки.

Только в одном случае нулевой байт влияет, это когда string перестаёт быть string.

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 33
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: unicode - конвертация, работа и прочее

Сообщение  tux в Пт Авг 15, 2008 8:05 am

Согласен, со string-ом я ошибся, пардон за дезинформацию))
avatar
tux

Сообщения : 365
Дата регистрации : 2008-04-06
Возраст : 29
Откуда : Сибирь

Посмотреть профиль http://tux.nsk.ru/

Вернуться к началу Перейти вниз

Re: unicode - конвертация, работа и прочее

Сообщение  Eric-S в Вт Авг 19, 2008 8:08 am

На счёт строк, это ладно. Я это уже давно знал.

А вот по теме конвертации юникода, мне есть чего сказать.
В инклудах лежит заголовочный файл "utf_conv.bi", в котором декларированы функции для конвертации unicode в ascii.
Это очень даже хорошо! Хоть и не совсем то. Но байтовый массив, ведь можно представить как zstring. И тогда ascii можно будет преобразовать в unicode.

Как я понял, можно указывать входную кодировку ascii, utf-8, utf-16, utf-32. Но как конкретно это делается? Попробую поискать ещё в примерах.

А вот тут всплыла другая проблема-то!
ascii это хорошо, но какая именно кодовая страница?

Как мне конвертировать в unicode и указать кодировку? В "utf_conv.bi" Я не встретил ничего похожего.
win-1251, dos-866, mac, koi и это только некоторые!

В windows есть api, они конвертят, им нужно только дать указатель на таблицу символов. Которые тоже непонятно где.
А если делать кросплатформенно?
Ну в самом деле, не вбивать же мне все эти таблици?!

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 33
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: unicode - конвертация, работа и прочее

Сообщение  Eric-S в Чт Авг 28, 2008 2:29 am

"Смотрит в книгу, видит фигу!"
Это про меня!

Только что в мануале заметил приписку к функциям str и wstr.
Оказываеться они также конвертируют строки из ascii в unicode и обратно. Вот чего я не ожидал, от старых и знакомых функций!

Правда теперь спрашиваеться, что делает заголовочный файл "utf_conv.bi"?

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 33
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: unicode - конвертация, работа и прочее

Сообщение  Eric-S в Пн Сен 29, 2008 10:20 pm

Я опять туплю. проблема с чтением из файла, в unicode.

Взгляните, пожалуйста, может заметите, мою ошибку.

Код:


' считываем коды
function get_chars( byVal file_name as string ) as string
dim r as string
dim uc as wstring ptr

' множитель для стандартизации размера буфера uc
dim ls as single
select case len(wstring)
case 4: ls = 1
case 2: ls = 0.5
case else: ls = 0.25
end select



' пытаемся открыть файл
' по очереди, каждым способом
' пока, файл будет открыт без ошибок
dim ff1 as integer = FreeFile
if open( file_name for input encoding "utf-32" as #ff1) = 0 then
uc = allocate( 4 * ls * lof(ff1))
else
if open( file_name for input encoding "utf-16" as #ff1) = 0 then
uc = allocate( 2 * ls * lof(ff1))
else
if open( file_name for input encoding "utf-8" as #ff1) = 0 then
uc = allocate( ls * lof(ff1))
else
if open( file_name for input encoding "ascii" as #ff1) = 0 then
uc = allocate( ls * lof(ff1))
end if
end if
end if
end if


' читаем из файла
if uc then
dim p as long
do while not eof(ff1)
*(uc + p) = winput(p + 1, ff1)
p += 1
loop

*(uc + p) = wchr(0)
print "p = "; p
print *uc

close #ff1
end if

return r
end function


get_chars("test.txt")
sleep


Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 33
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: unicode - конвертация, работа и прочее

Сообщение  Eric-S в Ср Дек 17, 2008 10:50 pm

Врятли кто ответит. Я просто жалуюсь на жизнь и всё такое.

От юникода я не отцеплялся, так как направление преспективное и правильное. Но вот реализация, достойна слёз. Хочеться биться головой об стену. Но знаю, что мне это не поможет.

Начало истории вы знаете. Я просто хотел научиться читать файлы в unicode. Полез разбираться, что это такое и на кой нужно.
Википедия мне обяснила, можно сказать открыла глаза.
http://ru.wikipedia.org/wiki/Unicode
Я впечатлился и решил переходить на юникод.

Тут-то и начались проблемы. Помните, как я метался на счёт "кривых указателей" и "неправельных функций". А это были цветочки.

Читать из unicode файла, я так ведь и не научился. Почему? Да потому, что юникод это не один жесткий формат, а динамичная и многоуровневая структура.


Если в памяти машины она представляеться ещё более-менее стандартно. Зависит от операционки, под windows один символ занимает 2 байта, то бод unix 4 байта.
Хотя тут есть ещё несколько заморочек. Одну и туже строку можно представить в четырёх способах записи, так, что прямое сравнивание скажет, что это разные строки. Нужно их приводить к одному формату.

А с файлами дела ещё сложнее. Форматов файлов очень много, вот только основные
utf-8
utf-16 be
utf-16 le
utf-32 be
utf-32 le
И есть ещё несколько совсем странных, суть которых я вообще не понимаю.


Концорциум юникода
http://unicode.org
Молчит. Как мне кажеться они занимаються, только тем, что ищют новые символы и заталкивают их в таблици, присваивая новые коды.
разработкой библиотек они не занимаються.

А жаль!
Назрел вопрос, о необходимости библиотеки, только для работы с юникодом. Причём это должна быть действительно очень мощная библиотека! Лично я её не потяну писать. Даже если бы я разобрался с юникодом.

Мои поиски подобных изделий, провалились.
А ведь ещё нужна библиотека перекодировки!

Кое что я нашел в qt. Кое что есть в windows. Но это всё не то. Нет стройной упорядоченной конструкции.

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


чтение файла
запись файла
определение формата файла (какой юникод или аски в нём)

компановка символов
разложение символов

конвертация из аски в юникод
конвертация из юникод в аски
(причём есесно с учётом кодировок)

транслитерация смысловая
транслитерация графическая
транслитерация фонетическая
транслитерация упрощенная
детранслитерация

удаление начальных и конечных пробелов
получение подстроки
поиск подстроки
замена символов по таблице
длина строки
символьный набор (все символы)

строку в число
число в строку

код символа
определение языка символа
определение регистра символа
перевод в нижней регистр
перевод в верхний регистр
первое слово с большой
все слова с большой

графическое представление символа
распознавание символа

прямое сравнение
сравнение фонетическое
сравнение графическое
сравнение лексическое
сравнение орфографическое
транслитерированное сравнение
детранслитерированное сравнение
машинописное сравнение
клавиатурное сравнение
сравнение Левенштейна
сравнение с потерей


Вот так вот. И что-то мне подсказывает, что я многое упустил.

А теперь вопрос на засыпку. И что делать?

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 33
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: unicode - конвертация, работа и прочее

Сообщение  tux в Чт Дек 18, 2008 9:25 am

Вообще, я уже достаточно давно сижу под Линуксом, и особо никогда не обращал внимания, но всегда работал с уникодовской кодировкой (ведь это стандарт для юниксов). Смысл в том, что у оператора OPEN есть необязательный параметр [encoding_type], где в винде по дефолту используется аски, а в линухе утф. При этом строки без проблем сохраняюся в переменной string и обрабатываются стандартными операторами. Вот только какую кодировку использует сам FB для string-а я незнаю, но во всяком случае мне всегда этого хватало.
avatar
tux

Сообщения : 365
Дата регистрации : 2008-04-06
Возраст : 29
Откуда : Сибирь

Посмотреть профиль http://tux.nsk.ru/

Вернуться к началу Перейти вниз

Re: unicode - конвертация, работа и прочее

Сообщение  Eric-S в Чт Дек 18, 2008 5:04 pm

freebasic, как наследник, qbasic, в string использует именно ascii.
Для юникода, нужно юзать wstring.
А вот например visual basic имеет строковый тип string, но это юникод.

Да, можно при открытии файла указать тип кодировки, например utf-8
open "file.txt" for input encoding "utf-8" as #1
но по умолчанию "ascii".

Но тут возникает другая проблема. Точнее их сразу несколько.

Как я понял, чтобы читать юникод (wstring) нужно юзать функцию WInput.
Всё хорошо, но ведь wstring, с нулём на конце. А что делать если в файле есть нулевой код?

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

Во первых нужно отбросить первые байты. От 0 до 4. Есть кажеться ещё некие заморочки, но я их не допёр и не встречал.

Во вторых в файле, длина символа изменна.
Если цифры и латинские буквы занимают 1 байт, то кирилические занимают 2 байта, а разные академические символы могут занимать 4 байта.

Ну допустим для utf-16 и utf-32 это кажеться фиксированным. (хотя я не уверен).

то вот utf-8... Так там прямо сказано, что от 1 до 9 байтов.

И вот как мне указать число символов, которые я хочу считать из файла?

Единственным вариантом вижу только, посимвольное считыванье. Но я уже давно отказался от подобного варварства, тормозящего машину.

Дальше, я могу загрузить файл, как битовый массив. Но нужна корректная функция конвертации этого массива в wstring.

Фроловы пишут:

Функции mbstowcs и MultiByteToWideChar преобразуют строку однобайтовых символов в строку Unicode, функции wcstombs и WideCharToMultiByte выполняют обратное преобразование.

Хорошо, а как их заюзать? Где они задекларированы? Я не нашел в freebasic такого. Да и это всё-таки winApi, что привязывает к винде.

Во freebasic нашел функции
CharToUTF
WCharToUTF
UTFToChar
UTFToWChar
см
"%programfiles%\freebasic\inc\utf_conv.bi"
Но что с ними делать, мне чесно говоря, всё ещё не очень понятно.
В мануале про них ничего нет. Что-то есть на форуме, но я не понял.
Я там у них спросил, functions utf_conv.bi


Как сохранять? print понимает wstring, но наткнувшись на нулевой код, он скажет, всё хватит и остановиться.

И это господа всё, что я смог найти! А мне, знаетели этого мало, для полноценной работы!
Может быть, где-то оно всё есть, но я не нашел.

Те функции, которые есть во freebasic. Я в них не уверен.
Например букву "ё" или "й" можно написать в двух вариантах одним и двумя кодами. А ведь есть ещё символы, которые указывают гарнитуру текста. Как с ними работать?

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 33
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: unicode - конвертация, работа и прочее

Сообщение  Eric-S в Ср Дек 24, 2008 3:17 pm

Гляньте пожалуйста код.
http://www.freebasic.net/forum/viewtopic.php?p=112720#112720

Код:

' class UFile

type UFile
declare function GetData( byVal fname as string = "" ) as uinteger
declare function PutData( byVal fname as string = "" ) as uinteger


rem private:
filename as string ' имя файла
dat as wstring ptr
end type


' загрузка текста
function UFile.GetData( byVal fname as string = "" ) as uinteger

' применяем имя файла
if fname <> "" then
this.filename = fname
end if

dim as wstring ptr ws ' pointer string
dim as uinteger ncharses ' numbers chars
dim as integer ff1 = FreeFile ' file descriptor


' сбрасываем данные
deallocate( this.dat )

' пытаемся открыть файл
' utf-32
if open( this.filename for input encoding "utf-32" as #ff1) = 0 then
   ncharses = 0.25 * lof(ff1) ' 4 byte in char
   '
else
   ' utf-16
   if open( this.filename for input encoding "utf-16" as #ff1) = 0 then
      ncharses = 0.5 * lof(ff1) ' 2 byte in char
      '
   else
      ' utf-8
      if open( this.filename for input encoding "utf-8" as #ff1) = 0 then
         ncharses = lof(ff1) ' minimum 1 byte in char
         '
         else
         ' ascii
         if open( this.filename for input encoding "ascii" as #ff1) = 0 then
            ncharses = lof(ff1) ' 1 byte in char
         end if
      end if
   end if
end if

if ncharses > 0 then
   ' читаем текст
   ws = allocate( (ncharses + 1) * len(wstring))
   *ws = winput( ncharses, ff1)
   close #ff1
   ncharses = len(*ws)
print *ws
   this.dat = reallocate( ws, (ncharses + 1) * len(wstring))
   deallocate( ws )
else
   ' ошибка открытия файла
   this.dat = 0
end if

function = ncharses ' возвращаем число риально считаных символов
end function

' запись текста
function UFile.PutData( byVal fname as string = "" ) as uinteger

if this.filename <> "" then
filename = fname
end if

dim ff1 as integer = FreeFile
if open( fname for output encoding "utf-8" as #ff1) = 0 then
print #ff1, *this.dat;
close #ff1
function = 1
else
function = 0
end if
end function


' end class


' тестирование класса
dim f as UFile ptr
f = new UFile

' тестовая строчка
dim as string s
s = "Hello, world!"
f->dat = allocate( (len(s) + 1) * len(wstring))
*f->dat = wstr(s)

' сохраняем в новый файл
f->PutData( "test1.txt" )

' читаем из файла
f->GetData( "utf-8.txt" )
print *f->dat

' сохраняем в другой файл
f->PutData( "test2.txt" )

delete f
sleep

Глючит чего-то.
И скорее всего проблема с reallocate.
Тогда это вообще не по теме юникода.

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 33
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: unicode - конвертация, работа и прочее

Сообщение  diakin в Вс Апр 12, 2009 2:15 pm

Не понимаю..
Открыл notebook, напечатал
абвгде
сохранил как UTF8
в файле вижу (FAR кодировка win)
п>їР°Р+Р_Р_Р_Рч
EF BB BF D0 B0 D0 B1 D0 B2 D0 B3 D0 B4 D0 B5

Пишу на FreeBasic код
Dim s As String
s = "абвгде"
Open f For Output Encoding "utf-8" As #1
'' The ascii string is converted to utf-8
Print #1, s;
Close #1

в файле вижу (FAR кодировка win)
п>їГ ГЎГўГ_Г¤Г_
EF BB BF C3 A0 C3 A1 C3 A2 C3 A3 C3 A4 C3 A5

В чем дело -то?

diakin

Сообщения : 37
Дата регистрации : 2009-04-06
Откуда : С-Петербург

Посмотреть профиль http://miraxem.com

Вернуться к началу Перейти вниз

Re: unicode - конвертация, работа и прочее

Сообщение  Eric-S в Вс Апр 12, 2009 7:26 pm

Так в том-то всё и дело, что кодировка не win 1251? а utf-8.
Хотя это даже не совсем кодировка в привычном понимании.
По любому в far'е и в чём-то другом такой файл нужно открывать как utf-8.
Если же пишешь исходник в юникоде, то оставь bom. (несколько спецальных байт в начале файла).

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 33
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: unicode - конвертация, работа и прочее

Сообщение  diakin в Вс Апр 12, 2009 9:00 pm

Не.. вот я им написал
Problem is that UTF8 file created FB is different from UTF8 file created by notepad with the same text "a be ve"
проблема в том, что файл в кодировке UTF-8 созданный в нотпаде отличается от файла созданного через freebasic Output Encoding "utf-8" с тем же самым текстом "абв"

В файле fb utf8 русское "a" кодируется как C3 A0
В файле notepad utf8 file русское "a" кодируется как D0 B0

Я нашел таблицу cp1251 to Unicode

http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1251.TXT

# Format: Three tab-separated columns
# Column #1 is the cp1251 code (in hex)
# Column #2 is the Unicode (in hex as 0xXXXX)
# Column #3 is the Unicode name (follows a comment sign, '#')

1251 Unicode
0xE0 0x0430 #CYRILLIC SMALL LETTER A
0xE1 0x0431 #CYRILLIC SMALL LETTER BE
0xE2 0x0432 #CYRILLIC SMALL LETTER VE


и еще http://www.utf8-chartable.de/unicode-utf8-table.pl?start=1024

# Column #1 is the Unicode code point
# Column #2 is the character
# Column #3 is the UTF-8(hex.)
# Column #4 is the name

U+00E0 à c3 a0 LATIN SMALL LETTER A WITH GRAVE
U+00E1 á c3 a1 LATIN SMALL LETTER A WITH ACUTE
U+00E2 â c3 a2 LATIN SMALL LETTER A WITH CIRCUMFLEX

U+0430 а d0 b0 CYRILLIC SMALL LETTER A
U+0431 б d0 b1 CYRILLIC SMALL LETTER BE
U+0432 в d0 b2 CYRILLIC SMALL LETTER VE

Как я вижу проблема в том, что fb использует
0xE0 (#CYRILLIC SMALL LETTER A) не как ascii код, а как unicode U+00E0 !

E0 - это ascii код (hex) буквы а
Получается так. Когда я сохраняю букву а в файл через Output Encoding "utf-8", то в файле получается код
C3 A0, что на самом деле соответствует букве à в формате utf8.
Что и подтверждает открытие файла в нотепаде, который видит там код C3 A0 и правильно показывает букву à.
Вроде так.

diakin

Сообщения : 37
Дата регистрации : 2009-04-06
Откуда : С-Петербург

Посмотреть профиль http://miraxem.com

Вернуться к началу Перейти вниз

Re: unicode - конвертация, работа и прочее

Сообщение  diakin в Вс Апр 12, 2009 10:49 pm

Вот еще вопрос.
Когда FreeBasic читает текстовый ascii файл as binary - просто байты, ascii коды, а затем сохраняет их используя...Output Encoding "utf-8", откуда он знает какую кодовую страницу надо использовать? Другими словами - на каком языке написаны исходные ascii коды?
Если исходный файл был на русском языке - в выходной utf8 файл будут записаны одни коды, если на греческом - другие коды и т.д.
По хорошему, открывая в редакторе текстовый файл ascii , пользователь должен иметь возможность выбрать язык, на котором данный текст написан и тогда, шрифт в редакторе должен устанавливаться соответственно выбранному языку. В языковой панели есть установка множества языков, помимо руского и английского, да и всякие DOS 866 и KOI8-R могут быть и для русского языка.
Но что-то у меня не получалось напечатать на установленном дополнительном языке. Все только русский или английский.
Так вот существуют ли редакторы в которых это реализовано? Кзалось бы это несложно.

diakin

Сообщения : 37
Дата регистрации : 2009-04-06
Откуда : С-Петербург

Посмотреть профиль http://miraxem.com

Вернуться к началу Перейти вниз

Re: unicode - конвертация, работа и прочее

Сообщение  diakin в Вс Апр 12, 2009 11:22 pm

Да нотепад может печатать тексты на установленном в языковой панели языке.

diakin

Сообщения : 37
Дата регистрации : 2009-04-06
Откуда : С-Петербург

Посмотреть профиль http://miraxem.com

Вернуться к началу Перейти вниз

Re: unicode - конвертация, работа и прочее

Сообщение  diakin в Вс Апр 12, 2009 11:31 pm

diakin пишет:
....
По хорошему, открывая в редакторе текстовый файл ascii , пользователь должен иметь возможность выбрать язык, на котором данный текст написан и тогда, шрифт в редакторе должен устанавливаться соответственно выбранному языку. В языковой панели есть установка множества языков, помимо руского и английского, да и всякие DOS 866 и KOI8-R могут быть и для русского языка.
... Кзалось бы это несложно.

Да так и происходит в нотепаде, единственно, что если часть текста печатать на одном языке, часть на другом, а остальное на третьем - то при попытке сохранить результат как ascii файл различие языков будет потеряно. В текстовом ascii файле не хранится никаких укзаний на то, на каком языке была напечатана та или другая часть текста. Для этого надо или сохранять файл в формате уникод - там для любого языка каждой букве присвоен уникальный номер (код). Или сохранять в формате RTF - там к тексту добавляются управляющие символы , которые сохраняют информацию в том числе и о языке.

уфф.. записал, теперь не забуду. lol!
Для памяти тоже
http://ru.wikipedia.org/wiki/Unicode#UTF-8

diakin

Сообщения : 37
Дата регистрации : 2009-04-06
Откуда : С-Петербург

Посмотреть профиль http://miraxem.com

Вернуться к началу Перейти вниз

Re: unicode - конвертация, работа и прочее

Сообщение  diakin в Пн Апр 13, 2009 1:02 am

OMG
Джеффри РИХТЕР "Windows для профессионалов"
ГЛАВА 2 Unicode
http://wm-help.net/books-online/book/59464/59464-13.html

Разрабатывая DLL, которую будут использовать и другие программисты, предусматривайте в ней по две версии каждой функции — для ANSI и для Unicode. В ANSI-версии просто выделяйте память, преобразуйте строки и вызывайте Unicode-версию той же функции. Shocked

diakin

Сообщения : 37
Дата регистрации : 2009-04-06
Откуда : С-Петербург

Посмотреть профиль http://miraxem.com

Вернуться к началу Перейти вниз

Re: unicode - конвертация, работа и прочее

Сообщение  Eric-S в Пн Апр 13, 2009 7:17 am

Ну да. Только я так и не понял, остались ли ещё вопросы или нет.

одну букву в юникоде можно кодировать по разному. Но она по прежнему останеться одной и той же буквой. Я не нашел четких алгоритмов для стандартизации. Но они точно есть.
К тому же при кодировании в utf-8 может быть добавлен ещё вариант из-за того как всё организовано. Хотя концорциум юникода рекомендует считать правильным более короткий вариант.

Теперь о freebasic. К сожалению он не понимает на каком языке написан исходник если он ascii. Возможности же указать язык компилятору тоже нет.

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

Зато если исходник в юникоде, то всё нормально с языками.

Хотя всё равно жаль, что freebasic использует именно char представление, а не wchar.

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 33
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: unicode - конвертация, работа и прочее

Сообщение  Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Страница 1 из 2 1, 2  Следующий

Предыдущая тема Следующая тема Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения