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

  • Автор темы Автор темы mazimaz
  • Дата начала Дата начала
M

mazimaz

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

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

Помогите, может у кого-то была подобная проблема.
Спасибо.
 
какой-то непонятный кусок кода...
 
Код:
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
вот функция целиком.
но проблема наверное не в функции..
 
Последнее редактирование:
Скорее всего проблема в исходных данных - они не в той кодировке в которой ожидается.
Может быть они уже перекодированы и вы пытаетесь сделать это ещё раз?
 
Скорее всего проблема в исходных данных - они не в той кодировке в которой ожидается.
Может быть они уже перекодированы и вы пытаетесь сделать это ещё раз?
есть массив данных. и ошибка возникает на некоторых элементах массива. они не перекодированы. такой процедуры нигде не выполняется, только при экспорте.
 
Скорее всего проблема в исходных данных - они не в той кодировке в которой ожидается.
Может быть они уже перекодированы и вы пытаетесь сделать это ещё раз?

Ну разве что каким-то образом данные в документах в разных кодировках, то есть весь документ в другой кодировке. Потому что при экспорте на всех текстовых данных перекодировка выдает неправильные символы.

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

Замечена особенность: одна и та же функция в агенте и в библиотеке отрабатывает по-разному.
Почему такое может быть?
При чем если в библиотеке функция, то она пишет кракозяблы для все документов в экспорте.
А если в агенте - только на некоторые.

Может ли еще быть проблема в том, что lotus поднят на linux?
 
у вас куча Mid и Left кот. "не нужны" есть ф-ция Replace ...
я так не увидел примера строки кот. подается на вход
для меня вовсе является загадкой ваша ф-ция (в обсуждаемом контексте) - она никак не управляет кодировкой
 
пример: @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?
домино - вы хотели сказать - только лучше работать будет ;)
а вот сервисы к кот. вы обращаетесь и локаль имеют важное значение
 
и судя по исходному тексту - у вас ISO кодировка прет как utf-8
вот подтверждение в линуховой консоли:
echo "ХеÑÑон, 49 ÐваÑдейÑкой дивизии Ñл." | iconv -f utf-8 -t ISO_8859-1
Херсон, 49 Гвардейской дивизии ул.
[DOUBLEPOST=1458231659,1458231583][/DOUBLEPOST]др. словами - вам отдают ISO_8859-1 , а вы ожидаете utf-8
 
Последнее редактирование модератором:
пример: @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
Адрес в итоге преобразовывается в первом случае в символы а во втором - нормально.
 
Вот пример двух записей.

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]повторю - ф-ция (данная) НЕ ПРИ ЧЕМ
 
не верю, вот второй:
---------------------------
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, если есть варианты, что можно еще сделать - пишите. Усердно проверю все варианты.
Пока экпериментирую, но неудачно. Были попытки запустить на другом сервере агент. Но тоже безрезультатно.
Спасибо, что тратите на мою проблему свое время.
 
@mazimaz, я пытаюсь вам объяснить - вы ищите не там и код, кот. виноват не известен (вы его не выложили)
[DOUBLEPOST=1458301623,1458301571][/DOUBLEPOST]есть разные варианты лечения кодировки, но нужно знать источник её
 
вообще, с убитой кодировкой бороться можно так
только у вас не LMBCS а ISO_8859-1
но вопрос - где "насрато" в кодировку
 
Ни разу не заморачивался с преобразованием кодировки при записи данных в Oracle. Вам оно точно надо? Без этого данные в Oraсle искажаются?
 
Ни разу не заморачивался с преобразованием кодировки при записи данных в Oracle. Вам оно точно надо? Без этого данные в Oraсle искажаются?
сильно подозреваю настройки ораклового сорца
и вопрос именно в коде, кот. мы так и не увидели
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!