Конференция "Журнал" » APC: Ошибка в коде (?) или снова про MultiByteToWideChar
 
  • guav © (12.11.06 22:34) [0]
    Вроде нашел ошибку в коде АРС, не уверен правда, что ошибка.
    См. мои комментарии:

    // если строка содержит многобайтовые символы

       SetLength(WS, Length(S)); // этой длины ей много будет

       if MultiByteToWideChar(cp_utf8, 0, PChar(S), -1, PWideChar(WS), Length(WS) + 1) = 0 then begin
       // тут проблем не будет, только в конце WS будет мусор

          Result := S;
          Exit;
       end;

       SetLength(Result, Length(WS)); // результирующая длина больше, чем требуется на длину мусора
       // но эта операция правильна, ansi - один байт на символ, тут просто у WS неправильная длина.

       if WideCharToMultiByte(cp_1251, 0, PWideChar(WS), Length(WS) + 1,   PChar(Result), Length(WS) + 1, nil, nil) = 0 then begin
       // тут пытаемся сконвертировать и строку и мусор. если получится, то длина будет больше чем нужно
       // нуль-терминатор на месте, но длина не правильная

          Result := S;
          Exit;
       end;

  • Anatoly Podgoretsky © (12.11.06 23:08) [1]
    > guav  (12.11.2006 22:34:00)  [0]

    Так ты до конца смотри, последнея строка  Result := PChar(Result);
    Результат точная строка, до первого нулевого символа.

    Я конечно мог бы сделать с получением длины необходимой строки, но это двойной вызов функции и в конце то же самое Result := S

    Зачем? Результат одинаковый.

    Не вижу проблемы. Мусор учтен, он убирается последней строкой, для UTF-8 этот метод подходит, поскольку результат всегда меньше по длине. Строка может содержать любой мусор в конце, важна только левая часть до первого ограничителя, что и убирается через функцию PChar
    Параметр -1 обеспечивает этот самый ноль.

    Давай свои доводы.
  • Anatoly Podgoretsky © (12.11.06 23:10) [2]
    > guav  (12.11.2006 22:34:00)  [0]

    Там где Result := S; Exit; - там присваивается входное значение в случае внутренней ошибки в работе функции MultiByteToWideChar и WideCharToMultiByte
  • Anatoly Podgoretsky © (12.11.06 23:23) [3]
    > guav  (12.11.2006 22:34:00)  [0]

    Я так понимаю, что ты уже скачал код и анализируешь?
    Как общее впечателение?
  • guav © (12.11.06 23:38) [4]
    > [1] Anatoly Podgoretsky ©   (12.11.06 23:08)

    Не заметил слона :-( ветку можно удалять. а можно и не удалять.

    более лучшим было бы решение не с урезанием Result а с урезанием WS (таким же образом, или по результату MultiByteToWideChar)

    PS: Я успешно поставил компонент. однако, сам проект окрывается сложнее [D7, Ics6]
  • Anatoly Podgoretsky © (12.11.06 23:50) [5]
    > guav  (12.11.2006 23:38:04)  [4]

    Да зачем удалять, если потребуется, то сюда же и можно писать.
  • Anatoly Podgoretsky © (12.11.06 23:54) [6]
    > guav  (12.11.2006 23:38:04)  [4]

    Рано послал ответ, я специально отказался от выделения точного места, функция это позволяет, в других проектах у меня это используется, просто здесь более эффективен этот метод, не надо считать, само присвоит ровно столько сколько нужно.

    Насчет установки - я предупреждал, три компонента, правда один все равно полезен - это TNT, а вот два остальных возможно никогда не будут использоваться, хотя если надо будет сделать что то на сторону с полностью встроеный БД, то и абсолют пригодится, а вот судьба ICS более печально, правильнее пользоваться, тем что идет с Дельфи, просто мне Инди не подошло, только потратил неделю, но плохой опыт - тоже опыт.
  • guav © (12.11.06 23:55) [7]
    > [3] Anatoly Podgoretsky ©   (12.11.06 23:23)
    > Как общее впечателение?

    Трудно пока сказать, мне сложно в это сразу вникнуть, особенно когда среда отвергает проект (пытаюсь открывать в Д7). Могу разве что попридираться к ReadSettings/SaveSettings или к MultiByteToWideChar :-)
  • Anatoly Podgoretsky © (12.11.06 23:56) [8]
    > guav  (12.11.2006 23:38:04)  [4]

    Упс, я писал, что нужен ICS5, я не знаю как себя это будет вести на бете версии 6.
  • guav © (12.11.06 23:57) [9]
    > [6] Anatoly Podgoretsky ©   (12.11.06 23:54)
    > я специально отказался от выделения точного места, функция
    > это позволяет, в других проектах у меня это используется,
    > просто здесь более эффективен этот метод, не надо считать,
    > само присвоит ровно столько сколько нужно.

    не понял.
  • guav © (12.11.06 23:59) [10]
    > [8] Anatoly Podgoretsky ©   (12.11.06 23:56)

    поведение не важно, мне лишь бы открыть в среде.
    Модули переименовал и всё ок вроде. Но наверно таки установлю ICS5
  • Anatoly Podgoretsky © (13.11.06 00:09) [11]
    > guav  (12.11.2006 23:55:07)  [7]

    Ну к этому можно придраться, хотя это самые не существенные куски, можно по разному реализовывать, тем более что я к одному замечанию, по поводу ReadSettings прислушался, сделал по другому, хотя и старый вариант тоже нормальный был.
  • Anatoly Podgoretsky © (13.11.06 00:10) [12]
    > guav  (12.11.2006 23:57:09)  [9]

    У функции можно спросить, сколько байт требуется для результата, затем выделить это место и снова вызвать уже для исполнения.
  • Anatoly Podgoretsky © (13.11.06 00:10) [13]
    > guav  (12.11.2006 23:59:10)  [10]

    И учти, что я делал на Д2006 может и тут что-то вылезет.
  • guav © (13.11.06 00:18) [14]
    > [12] Anatoly Podgoretsky ©   (13.11.06 00:10)

    Понял. Долгий, но зато надёжный способ.

    Про ReadSettings/SaveSettings:
    Ну не нравится мне когда вышел с максимизированным окном, после чего окно не уменьшается при восстанавливании wsNormal. да и повторение кода в каждой форме уже может быть поводом для придирки :-)


    > [13] Anatoly Podgoretsky ©   (13.11.06 00:10)
    > И учти, что я делал на Д2006 может и тут что-то вылезет.

    Кроме лишних свойств в ДФМ и кодировки модулей в УТФ-7 - ничего, вроде.
  • Anatoly Podgoretsky © (13.11.06 00:23) [15]
    > guav  (13.11.2006 0:18:14)  [14]

    UTF это не дань моде, а насущная необходимость, при том это делаю не я, а среда. В отличии от предудущих версий в 2006 это сделано хорошо, а предыдущие версии мне крови попортили.
  • guav © (13.11.06 00:24) [16]
    > [15] Anatoly Podgoretsky ©   (13.11.06 00:23)

    Я не возражаю против UTF-8. D7 возражает.
  • Ketmar © (13.11.06 00:30) [17]
    >[16] guav(c) 13-Nov-2006, 00:24
    >Я не возражаю против UTF-8. D7 возражает.
    нотепадом её убивать.
  • Anatoly Podgoretsky © (13.11.06 00:30) [18]
    > guav  (13.11.2006 0:24:16)  [16]

    Знаю, но это не первый раз, не считая свойств. Издержки. Ну не хочет Борланд сделать раз и навсегда Юникод, а на дворе уже 2006 год.
    Сообственно уже в Д6 были зачатки, тексты кодировались с некотором текстовом подобии Юникод и вот тут то и возникала подлянка при переносе на машину с другой локализацией, хотели сделать хорошо, а получилось как всегда и трудно было программировать тексты более чем на одном языке, хоть в 2006 сделали что-то более приличное, но до нормального еще далеко.
  • Anatoly Podgoretsky © (13.11.06 00:31) [19]
    > Ketmar  (13.11.2006 0:30:17)  [17]

    Убить то можно, не будет ли других проблем?
 
Конференция "Журнал" » APC: Ошибка в коде (?) или снова про MultiByteToWideChar
Есть новые Нет новых   [118444   +30][b:0][p:0.002]