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

Тема в разделе "Lotus - Программирование", создана пользователем mazimaz, 14 мар 2016.

  1. mazimaz

    mazimaz Member

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

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

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

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.080
    Симпатии:
    300
    какой-то непонятный кусок кода...
     
  3. mazimaz

    mazimaz Member

    Регистрация:
    2 окт 2009
    Сообщения:
    14
    Симпатии:
    0
    Код (LotusScript):
    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
    вот функция целиком.
    но проблема наверное не в функции..
     
    #3 mazimaz, 15 мар 2016
    Последнее редактирование модератором: 15 мар 2016
  4. mazimaz

    mazimaz Member

    Регистрация:
    2 окт 2009
    Сообщения:
    14
    Симпатии:
    0
    добавлен код целиком
     
  5. garrick

    garrick Lotus team
    Lotus team

    Регистрация:
    26 окт 2009
    Сообщения:
    773
    Симпатии:
    52
    Скорее всего проблема в исходных данных - они не в той кодировке в которой ожидается.
    Может быть они уже перекодированы и вы пытаетесь сделать это ещё раз?
     
  6. mazimaz

    mazimaz Member

    Регистрация:
    2 окт 2009
    Сообщения:
    14
    Симпатии:
    0
    есть массив данных. и ошибка возникает на некоторых элементах массива. они не перекодированы. такой процедуры нигде не выполняется, только при экспорте.
     
  7. mazimaz

    mazimaz Member

    Регистрация:
    2 окт 2009
    Сообщения:
    14
    Симпатии:
    0
    Ну разве что каким-то образом данные в документах в разных кодировках, то есть весь документ в другой кодировке. Потому что при экспорте на всех текстовых данных перекодировка выдает неправильные символы.

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

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.080
    Симпатии:
    300
  9. garrick

    garrick Lotus team
    Lotus team

    Регистрация:
    26 окт 2009
    Сообщения:
    773
    Симпатии:
    52
    Вопрос очень непростой. Любой текстовый файл для компьютера просто набор байтов, определить складывается ли этот набор в какой-то осмысленный текст может только человек, визуально. Компьютеру для этого потребуется произвести какой-нибудь эвристический анализ полученного текста, да и то 100% гарантии нет никогда. Если бы вы точно знали, что первая строка файла всегда содержит определённую фразу, то это сильно бы упростило задачу анализа кодировки. Можно попробовать позаимствовать готовый модуль у Mozilla Mozilla Charset Detectors, написано на C++, предлагается в виде исходников или DLL библиотеки, есть порт на Java jChardet. Можно попробовать написать свой на Lotus Script, ознакомившись с теорией Автоматическое определение кодировки текста. Но, как я уже заметил ранее, 100% гарантии нет никогда. Поэтому люди и придумали XML - там в заголовке файла можно указать кодировку.
     
  10. mazimaz

    mazimaz Member

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

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

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.080
    Симпатии:
    300
    у вас куча Mid и Left кот. "не нужны" есть ф-ция Replace ...
    я так не увидел примера строки кот. подается на вход
    для меня вовсе является загадкой ваша ф-ция (в обсуждаемом контексте) - она никак не управляет кодировкой
     
  12. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.080
    Симпатии:
    300
    пример: @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]
    домино - вы хотели сказать - только лучше работать будет ;)
    а вот сервисы к кот. вы обращаетесь и локаль имеют важное значение
     
  13. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.080
    Симпатии:
    300
    и судя по исходному тексту - у вас ISO кодировка прет как utf-8
    вот подтверждение в линуховой консоли:
    [DOUBLEPOST=1458231659,1458231583][/DOUBLEPOST]др. словами - вам отдают ISO_8859-1 , а вы ожидаете utf-8
     
    #13 lmike, 17 мар 2016
    Последнее редактирование модератором: 17 мар 2016
  14. mazimaz

    mazimaz Member

    Регистрация:
    2 окт 2009
    Сообщения:
    14
    Симпатии:
    0
    Вот пример двух записей.

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

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.080
    Симпатии:
    300
    не верю, вот второй:
    ---------------------------
    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]повторю - ф-ция (данная) НЕ ПРИ ЧЕМ
     
  16. mazimaz

    mazimaz Member

    Регистрация:
    2 окт 2009
    Сообщения:
    14
    Симпатии:
    0
    Текст скопирован с документа. Возможно при копировании произошли изменения?
    Если их преобразовывать через @URLEncode на локальной машине, то результат тот, что вы показали.
    Но если пускать это преобразование на сервере, и через поля документа - то результат разный. Собака зарыта в документе.
    Что я делаю сейчас:
    Если мне нужно все данные передать в oracle (а именно такая задача передо мной стоит), то в данной ситуации я не использую @URLEncode (потому что он не работает) а просто запускаю экспорт на локалке и жду пока отработает скрипт. Но это стыд программиста, нужно как-то автоматизировать процесс.
    Попробую как-то подвязать ISO_8859-1, если есть варианты, что можно еще сделать - пишите. Усердно проверю все варианты.
    Пока экпериментирую, но неудачно. Были попытки запустить на другом сервере агент. Но тоже безрезультатно.
    Спасибо, что тратите на мою проблему свое время.
     
  17. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.080
    Симпатии:
    300
    @mazimaz, я пытаюсь вам объяснить - вы ищите не там и код, кот. виноват не известен (вы его не выложили)
    [DOUBLEPOST=1458301623,1458301571][/DOUBLEPOST]есть разные варианты лечения кодировки, но нужно знать источник её
     
  18. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.080
    Симпатии:
    300
    вообще, с убитой кодировкой бороться можно так
    только у вас не LMBCS а ISO_8859-1
    но вопрос - где "насрато" в кодировку
     
  19. garrick

    garrick Lotus team
    Lotus team

    Регистрация:
    26 окт 2009
    Сообщения:
    773
    Симпатии:
    52
    Ни разу не заморачивался с преобразованием кодировки при записи данных в Oracle. Вам оно точно надо? Без этого данные в Oraсle искажаются?
     
  20. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.080
    Симпатии:
    300
    сильно подозреваю настройки ораклового сорца
    и вопрос именно в коде, кот. мы так и не увидели
     
Загрузка...

Поделиться этой страницей