Решено: Принудительно преобразовать строку в UTF8

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Решено: Принудительно преобразовать строку в UTF8

Сообщение azsx » 06.01.2016 15:50:07

Получаю целиком в строку содержимое текстового файла. Эти файлы далеко не всегда созданы в utf8, возможны другие кодировки (в том числе арабы, китайцы и прочие). Какая кодировка в конкретном случае я не знаю. Внутри lazarus переменная стандартная (utf16 как я понимаю), поставить ее как utf8 я пробовал - не помогло. Мне надо записать эту переменную целиком в postgresql в поле text, который в формате utf8. Если в файле есть хоть один символ не utf8 - то postgres выводит исключение и не записывает запись. Так и пишет, такой то символ - не utf8. Вопросы:
1. Как перед записью в базу преобразовать переменную в utf8, а затем вернуть как она была?
2. Если первое невозможно, то как принудительно преобразовать (исключить) все символы не utf8?
Последний раз редактировалось azsx 07.01.2016 20:21:55, всего редактировалось 1 раз.
azsx
энтузиаст
 
Сообщения: 959
Зарегистрирован: 16.11.2015 06:38:32

Re: Принудительно преобразовать строку в UTF8

Сообщение bormant » 06.01.2016 21:08:51

Каша какая-то.

UTF-8 -- это один из способов кодирования юникодных кодовых точек, как и любая другая кодировка.
Перекодирование в UTF-8 -- это восстановление из исходной кодировки юникодных кодовых точек и их кодирование в UTF-8 (в любую другую кодировку в общем случае -- точно также).

Почему получаются ошибки при попытке записать произвольную последовательность байт, сказав, что она уже в UTF-8? Дело в том, что поскольку один символ может быть кодирован последовательностью от 1 до 6 байт, необходимы средства для задания длины последовательности; если стартовый байт указывает на многобайтный символ, то и составные байты несут в себе информацию, что они являются продолжением. Так сделано, чтобы при чтении часть символа не могла быть воспринята как отдельный символ.
Однако в произвольной последовательности соблюдение указанных правил ничем не гарантируется. Если попытаться раскодировать произвольную последовательность из UTF-8 в, скажем, UTF-32, то ошибки практически неизбежны (если только речь не про ASCII).
Аватара пользователя
bormant
постоялец
 
Сообщения: 408
Зарегистрирован: 21.03.2012 11:26:01

Re: Принудительно преобразовать строку в UTF8

Сообщение Ism » 06.01.2016 21:35:04

Тут 2 пути
1 Приводить всегда к корректному utf8 перед записью
2 Писать в базу в блоб поле, там все равно какая кодировка. Но это ничем не отличается от сохранения бинарного файла
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: Принудительно преобразовать строку в UTF8

Сообщение Sharfik » 06.01.2016 21:51:47

azsx писал(а):Получаю целиком в строку содержимое текстового файла.

Текстовый файл, текстовому файлу рознь. Если это XML, HTML там в начале есть указание кодировки.
azsx писал(а):Внутри lazarus переменная стандартная (utf16 как я понимаю)

UTF8 по умолчанию, если не задана другая.
azsx писал(а):1. Как перед записью в базу преобразовать переменную в utf8, а затем вернуть как она была?

Если задача стоит так, то забить и записывать не текст, а набор байт.

Напиши себе ТЗ четкое, и решай задачу в соответствии с ним. Нафига перекодировать, если отдавать все равно в первоначальной кодировке?
Если это по каким то условиям надо, то нужен тогда диалог с пользователем, в котором будет пример текста предполагаемая кодировка файла и возможность ее сменить.

ИМХО.
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 809
Зарегистрирован: 20.07.2013 01:04:30

Re: Принудительно преобразовать строку в UTF8

Сообщение Vadim » 06.01.2016 22:51:11

azsx
Когда Вы читаете файл в строку, знаете в какой кодировке сам файл?
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Принудительно преобразовать строку в UTF8

Сообщение azsx » 07.01.2016 04:16:49

Каша какая-то.

у меня есть переменная, про которую точно известно только одно - по своей сути хотя бы часть этой переменной - это текст. Мне не известна кодировка переменной. Мне надо конвертировать переменную в utf8.
Так как оказывается задача эта слишком сложна, то всё равно уже какой ценой. Пусть там половина текста потеряется, пусть вопросики станут на спец символах - лишь бы строка стала utf8.
Когда Вы читаете файл в строку, знаете в какой кодировке сам файл?

нет.
1 Приводить всегда к корректному utf8 перед записью

вот я не могу понять как привести строку в произвольной кодировке к utf8. Пусть исключить не верную последовательность байт или преобразовать их как то - но только чтобы стала utf8.
---
поле blob в моем случае - это крайняя мера. Тогда уж лучше в самих файлах и хранить. В поле text мне нужен поиск.
то нужен тогда диалог с пользователем

пользователь я, файлов на сегодня 300К. Я не готов к диалогу с компьютером.
azsx
энтузиаст
 
Сообщения: 959
Зарегистрирован: 16.11.2015 06:38:32

Re: Принудительно преобразовать строку в UTF8

Сообщение Vadim » 07.01.2016 08:11:06

azsx
Встроенными средствами Postgre не пробовали пользоваться? Например, convert(), convert_to(), decode()...
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Принудительно преобразовать строку в UTF8

Сообщение resident » 07.01.2016 16:09:47

А это не пойдет?
http://wiki.freepascal.org/Theodp
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Принудительно преобразовать строку в UTF8

Сообщение Ism » 07.01.2016 17:37:31

Насчет неизвестной кодировки я вот что городил
viewtopic.php?f=30&t=9251&p=73876
По сути анализатор кодировки, и эта штука ошибалась редко
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: Принудительно преобразовать строку в UTF8

Сообщение azsx » 07.01.2016 20:09:24

А это не пойдет?
http://wiki.freepascal.org/Theodp

resident большое спасибо, как раз этот способ - полное решение моей проблемы. На тесте из 109 тысяч файлов кодировка не верно конвертировалась 2 раза: 1. файл вирус, типа ехе внутри; 2. хитровыдуманный файл, явно созданный с божьей помощью специально, чтобы позлить меня. Во втором файле срезался на 0ха9 зы а также внезапно всплыла проблема, что если в запросе в постгрес много тильд ' - то парсер постгреса ломается. 5 файлов. Пишут об этом только на нерусском, как я понял люди в курсе, всех всё устраивает.
---
Насчет неизвестной кодировки я вот что городил

спасибо надо закинуть в закладки, но пока для моей задачи мне безразлична кодировка.

Добавлено спустя 21 минуту 13 секунд:
Re: Решено: Принудительно преобразовать строку в UTF8
---
зызы
кстати Вадим, встроенные средства не работали, пробовал.
azsx
энтузиаст
 
Сообщения: 959
Зарегистрирован: 16.11.2015 06:38:32

Re: Решено: Принудительно преобразовать строку в UTF8

Сообщение resident » 07.01.2016 20:41:25

azsx писал(а):если в запросе в постгрес много тильд ' - то парсер постгреса ломается

А вы используете Params?
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Решено: Принудительно преобразовать строку в UTF8

Сообщение azsx » 09.01.2016 01:36:49

А вы используете Params?

нет, так как не знаю, что это такое.
azsx
энтузиаст
 
Сообщения: 959
Зарегистрирован: 16.11.2015 06:38:32

Re: Решено: Принудительно преобразовать строку в UTF8

Сообщение resident » 09.01.2016 12:49:42

azsx писал(а):нет, так как не знаю, что это такое

Если узнаете, то ваша проблема уйдет с вероятностью 99%. ИМХО
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Решено: Принудительно преобразовать строку в UTF8

Сообщение azsx » 09.01.2016 17:43:03

не спорю, что выгляжу навязчивым, но pg_query_params я использовал только для php. Для Lazarus я его использовать не умею.
Опять же в ошибке пишет
postgresql - could not determine data type of parameter $1
из чего можно погадать, что стандартный модуль сам передает данные через параметр. Я не прав?
azsx
энтузиаст
 
Сообщения: 959
Зарегистрирован: 16.11.2015 06:38:32

Re: Решено: Принудительно преобразовать строку в UTF8

Сообщение resident » 10.01.2016 04:18:23

Это все со стороны Лазаруса. Тоже самое в Делфи. Информации море в инете.
https://www.google.ru/search?q=params+L ... wAPC_YWoCQ
Первая ссылка
Parameters in TSQLQuery.SQL
.....
Parameters have the following advantages:
....
no need to escape text data like O'Malley's "SQL Horror"
....

https://www.google.ru/search?num=100&ne ... aG6caMTYac
Первая, вторая и еще море ссылок
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 224

Рейтинг@Mail.ru