Проблема при переводе в кодировку utf-8

02.10.2009
14
0
#1
Добрый день.
У меня возникла проблема при переводе текста в кодировку UTF-8.
Ранее функция работала без сбоев, но недавно что-то в ней сломалось и функция начала выдавать обработанные данные в виде Херсон, 49 Гвардейской дивизии ул.
Функция используется при передаче данных в oracle.
Данные - текстовые, обычный список адресов.
Сбоит как-то хаотично, нельзя определить на что именно функция выдает кракозяблы.

Dim res As Variant
Dim stF As String
stF = { @URLEncode("UTF-8"; "} + st + {") }
res = Evaluate( stF )
transl= res (0)

Помогите, может у кого-то была подобная проблема.
Спасибо.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 567
263
#2
какой-то непонятный кусок кода...
 
02.10.2009
14
0
#3
Код:
Function Translit( st ) As String
	Dim Result As Variant
	Dim stFormula As String
	Dim pos, i As Integer
	Dim ch, chNext As String
	While InStr( st, Chr(92) ) > 0
		pos = InStr( st, Chr(92) )
		st = Left( st, pos-1 ) + "~" + Mid( st, pos + 1, 99999)
	Wend
 
	While InStr( st, {"} ) > 0 '--- kill "
		pos = InStr( st, {"} )
		st = Left( st, pos-1 ) + "~" + Mid( st, pos + 1, 99999)
	Wend
 
	While InStr( st, {'} ) > 0 '--- kill "
		pos = InStr( st, {'} )
		st = Left( st, pos-1 ) + "`" + Mid( st, pos + 1, 99999)
	Wend
 
	For i = 1 To Len(st)-1
		ch = Mid( st, i, 1)
		chNext = Mid( st, i+1, 1)
		If ch = Chr(92) Then
			If chNext<>Chr(92) Then st = Left( st, i ) + "\" + Mid( st, i + 1, 99999)
			i = i + 1
		End If
	Next
 
	stFormula = { @URLEncode("UTF-8"; "} + st + {") }
	result = Evaluate( stFormula )
	Translit = result(0)
End Function
вот функция целиком.
но проблема наверное не в функции..
 
Последнее редактирование модератором:

garrick

Lotus team
26.10.2009
894
61
#5
Скорее всего проблема в исходных данных - они не в той кодировке в которой ожидается.
Может быть они уже перекодированы и вы пытаетесь сделать это ещё раз?
 
02.10.2009
14
0
#6
Скорее всего проблема в исходных данных - они не в той кодировке в которой ожидается.
Может быть они уже перекодированы и вы пытаетесь сделать это ещё раз?
есть массив данных. и ошибка возникает на некоторых элементах массива. они не перекодированы. такой процедуры нигде не выполняется, только при экспорте.
 
02.10.2009
14
0
#7
Скорее всего проблема в исходных данных - они не в той кодировке в которой ожидается.
Может быть они уже перекодированы и вы пытаетесь сделать это ещё раз?
Ну разве что каким-то образом данные в документах в разных кодировках, то есть весь документ в другой кодировке. Потому что при экспорте на всех текстовых данных перекодировка выдает неправильные символы.

А как отследить кодировку?...
 

garrick

Lotus team
26.10.2009
894
61
#9
А как отследить кодировку?...
Вопрос очень непростой. Любой текстовый файл для компьютера просто набор байтов, определить складывается ли этот набор в какой-то осмысленный текст может только человек, визуально. Компьютеру для этого потребуется произвести какой-нибудь эвристический анализ полученного текста, да и то 100% гарантии нет никогда. Если бы вы точно знали, что первая строка файла всегда содержит определённую фразу, то это сильно бы упростило задачу анализа кодировки. Можно попробовать позаимствовать готовый модуль у Mozilla
Для просмотра контента необходимо: Войти или зарегистрироваться
, написано на C++, предлагается в виде исходников или DLL библиотеки, есть порт на Java
Для просмотра контента необходимо: Войти или зарегистрироваться
. Можно попробовать написать свой на Lotus Script, ознакомившись с теорией
Для просмотра контента необходимо: Войти или зарегистрироваться
. Но, как я уже заметил ранее, 100% гарантии нет никогда. Поэтому люди и придумали XML - там в заголовке файла можно указать кодировку.
 
02.10.2009
14
0
#10
@URLEncode не задает кодировку
Для просмотра контента необходимо: Войти или зарегистрироваться
, а преобразует "не безопасные" символы в их шестнадцатиричный вид
Замечена особенность: одна и та же функция в агенте и в библиотеке отрабатывает по-разному.
Почему такое может быть?
При чем если в библиотеке функция, то она пишет кракозяблы для все документов в экспорте.
А если в агенте - только на некоторые.

Может ли еще быть проблема в том, что lotus поднят на linux?
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 567
263
#11
у вас куча Mid и Left кот. "не нужны" есть ф-ция Replace ...
я так не увидел примера строки кот. подается на вход
для меня вовсе является загадкой ваша ф-ция (в обсуждаемом контексте) - она никак не управляет кодировкой
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 567
263
#12
пример: @Prompt([OK];"Info";@URLEncode("UTF-8";"бе-бе-бе"))
---------------------------
Info
---------------------------
%D0%B1%D0%B5-%D0%B1%D0%B5-%D0%B1%D0%B5
---------------------------
ОК
---------------------------
[DOUBLEPOST=1458230484,1458230388][/DOUBLEPOST]т.е. мы получаем (как написано в хэлпе) - 16ричное представление символов (кот. не ASCII и кот. "не безопасны")
[DOUBLEPOST=1458230688][/DOUBLEPOST]напишите процесс - чего берете, куда суете, чего получаете
[DOUBLEPOST=1458230781][/DOUBLEPOST]еще раз акцентирую внимание: @URLEncode не занимается кодировкой ВАЩЕ
[DOUBLEPOST=1458230953][/DOUBLEPOST]
Может ли еще быть проблема в том, что lotus поднят на linux?
домино - вы хотели сказать - только лучше работать будет ;)
а вот сервисы к кот. вы обращаетесь и локаль имеют важное значение
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 567
263
#13
и судя по исходному тексту - у вас ISO кодировка прет как utf-8
вот подтверждение в линуховой консоли:
echo "ХеÑÑон, 49 ÐваÑдейÑкой дивизии Ñл." | iconv -f utf-8 -t ISO_8859-1
Херсон, 49 Гвардейской дивизии ул.
[DOUBLEPOST=1458231659,1458231583][/DOUBLEPOST]др. словами - вам отдают ISO_8859-1 , а вы ожидаете utf-8
 
Последнее редактирование модератором:
02.10.2009
14
0
#14
пример: @Prompt([OK];"Info";@URLEncode("UTF-8";"бе-бе-бе"))
---------------------------
Info
---------------------------
%D0%B1%D0%B5-%D0%B1%D0%B5-%D0%B1%D0%B5
---------------------------
ОК
---------------------------
[DOUBLEPOST=1458230484,1458230388][/DOUBLEPOST]т.е. мы получаем (как написано в хэлпе) - 16ричное представление символов (кот. не ASCII и кот. "не безопасны")
[DOUBLEPOST=1458230688][/DOUBLEPOST]напишите процесс - чего берете, куда суете, чего получаете
[DOUBLEPOST=1458230781][/DOUBLEPOST]еще раз акцентирую внимание: @URLEncode не занимается кодировкой ВАЩЕ
[DOUBLEPOST=1458230953][/DOUBLEPOST]домино - вы хотели сказать - только лучше работать будет ;)
а вот сервисы к кот. вы обращаетесь и локаль имеют важное значение
Вот пример двух записей.

ADDRESS
Не попадает: Склад, Киев, Глубочицкая ул., 17
Попадает: Склад, Киев, Глубочицкая ул., 17
Адрес в итоге преобразовывается в первом случае в символы а во втором - нормально.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 567
263
#15
Вот пример двух записей.

ADDRESS
Не попадает: Склад, Киев, Глубочицкая ул., 17
Попадает: Склад, Киев, Глубочицкая ул., 17
Адрес в итоге преобразовывается в первом случае в символы а во втором - нормально.
не верю, вот второй:
---------------------------
Info
---------------------------
%D0%9F%D0%BE%D0%BF%D0%B0%D0%B4%D0%B0%D0%B5%D1%82%3A%20%D0%A1%D0%BA%D0%BB%D0%B0%D0%B4%2C%20%D0%9A%D0%B8%D0%B5%D0%B2%2C%20%D0%93%D0%BB%D1%83%D0%B1%D0%BE%D1%87%D0%B8%D1%86%D0%BA%D0%B0%D1%8F%20%D1%83%D0%BB.%2C%2017
---------------------------
ОК
---------------------------
[DOUBLEPOST=1458300684,1458300420][/DOUBLEPOST]повторю - ф-ция (данная) НЕ ПРИ ЧЕМ
 
02.10.2009
14
0
#16
не верю, вот второй:
---------------------------
Info
---------------------------
%D0%9F%D0%BE%D0%BF%D0%B0%D0%B4%D0%B0%D0%B5%D1%82%3A%20%D0%A1%D0%BA%D0%BB%D0%B0%D0%B4%2C%20%D0%9A%D0%B8%D0%B5%D0%B2%2C%20%D0%93%D0%BB%D1%83%D0%B1%D0%BE%D1%87%D0%B8%D1%86%D0%BA%D0%B0%D1%8F%20%D1%83%D0%BB.%2C%2017
---------------------------
ОК
---------------------------
Текст скопирован с документа. Возможно при копировании произошли изменения?
Если их преобразовывать через @URLEncode на локальной машине, то результат тот, что вы показали.
Но если пускать это преобразование на сервере, и через поля документа - то результат разный. Собака зарыта в документе.
Что я делаю сейчас:
Если мне нужно все данные передать в oracle (а именно такая задача передо мной стоит), то в данной ситуации я не использую @URLEncode (потому что он не работает) а просто запускаю экспорт на локалке и жду пока отработает скрипт. Но это стыд программиста, нужно как-то автоматизировать процесс.
Попробую как-то подвязать ISO_8859-1, если есть варианты, что можно еще сделать - пишите. Усердно проверю все варианты.
Пока экпериментирую, но неудачно. Были попытки запустить на другом сервере агент. Но тоже безрезультатно.
Спасибо, что тратите на мою проблему свое время.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 567
263
#17
@mazimaz, я пытаюсь вам объяснить - вы ищите не там и код, кот. виноват не известен (вы его не выложили)
[DOUBLEPOST=1458301623,1458301571][/DOUBLEPOST]есть разные варианты лечения кодировки, но нужно знать источник её
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 567
263
#18
вообще, с убитой кодировкой бороться можно так
только у вас не LMBCS а ISO_8859-1
но вопрос - где "насрато" в кодировку
 

garrick

Lotus team
26.10.2009
894
61
#19
Ни разу не заморачивался с преобразованием кодировки при записи данных в Oracle. Вам оно точно надо? Без этого данные в Oraсle искажаются?
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 567
263
#20
Ни разу не заморачивался с преобразованием кодировки при записи данных в Oracle. Вам оно точно надо? Без этого данные в Oraсle искажаются?
сильно подозреваю настройки ораклового сорца
и вопрос именно в коде, кот. мы так и не увидели