• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Проблема при переводе в кодировку 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)

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

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 927
608
BIT
150
какой-то непонятный кусок кода...
 
M

mazimaz

Код:
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
1 342
150
BIT
128
Скорее всего проблема в исходных данных - они не в той кодировке в которой ожидается.
Может быть они уже перекодированы и вы пытаетесь сделать это ещё раз?
 
M

mazimaz

Скорее всего проблема в исходных данных - они не в той кодировке в которой ожидается.
Может быть они уже перекодированы и вы пытаетесь сделать это ещё раз?
есть массив данных. и ошибка возникает на некоторых элементах массива. они не перекодированы. такой процедуры нигде не выполняется, только при экспорте.
 
M

mazimaz

Скорее всего проблема в исходных данных - они не в той кодировке в которой ожидается.
Может быть они уже перекодированы и вы пытаетесь сделать это ещё раз?

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

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

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 927
608
BIT
150
@URLEncode не задает кодировку , а преобразует "не безопасные" символы в их шестнадцатиричный вид
 

garrick

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

mazimaz

@URLEncode не задает кодировку , а преобразует "не безопасные" символы в их шестнадцатиричный вид

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

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

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 927
608
BIT
150
у вас куча Mid и Left кот. "не нужны" есть ф-ция Replace ...
я так не увидел примера строки кот. подается на вход
для меня вовсе является загадкой ваша ф-ция (в обсуждаемом контексте) - она никак не управляет кодировкой
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 927
608
BIT
150
пример: @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
7 927
608
BIT
150
и судя по исходному тексту - у вас ISO кодировка прет как utf-8
вот подтверждение в линуховой консоли:
echo "ХеÑÑон, 49 ÐваÑдейÑкой дивизии Ñл." | iconv -f utf-8 -t ISO_8859-1
Херсон, 49 Гвардейской дивизии ул.
[DOUBLEPOST=1458231659,1458231583][/DOUBLEPOST]др. словами - вам отдают ISO_8859-1 , а вы ожидаете utf-8
 
Последнее редактирование модератором:
M

mazimaz

пример: @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
7 927
608
BIT
150
Вот пример двух записей.

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]повторю - ф-ция (данная) НЕ ПРИ ЧЕМ
 
M

mazimaz

не верю, вот второй:
---------------------------
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
7 927
608
BIT
150
@mazimaz, я пытаюсь вам объяснить - вы ищите не там и код, кот. виноват не известен (вы его не выложили)
[DOUBLEPOST=1458301623,1458301571][/DOUBLEPOST]есть разные варианты лечения кодировки, но нужно знать источник её
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 927
608
BIT
150
вообще, с убитой кодировкой бороться можно так
только у вас не LMBCS а ISO_8859-1
но вопрос - где "насрато" в кодировку
 

garrick

Lotus Team
26.10.2009
1 342
150
BIT
128
Ни разу не заморачивался с преобразованием кодировки при записи данных в Oracle. Вам оно точно надо? Без этого данные в Oraсle искажаются?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 927
608
BIT
150
Ни разу не заморачивался с преобразованием кодировки при записи данных в Oracle. Вам оно точно надо? Без этого данные в Oraсle искажаются?
сильно подозреваю настройки ораклового сорца
и вопрос именно в коде, кот. мы так и не увидели
 
Мы в соцсетях:

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