1

Тема: AHK: Преобразование кодировки файла, упакованного в CHM

Подскажите, почему такой код не работает (попытка ANSI HTML-файл, упакованный в C:\WINDOWS\Help\clipbrd.chm (путь для XP), преобразовать в UTF-8):


#SingleInstance Force

fPath = C:\WINDOWS\Help\clipbrd.chm  ; Путь для XP

URL := "mk:@MSITStore:" fPath "::/whatis_intro_cb.htm"

req := ComObjCreate("Msxml2.XMLHTTP.6.0")
req.open("GET", URL, 0)
req.send
ResponseText := req.responseText
req := ""

ResponseText := Ansi2UTF8(ResponseText)

MsgBox, % RegExReplace(ResponseText, "s).*?<title>(.*)?</title>.*", "$1")


Ansi2UTF8(sString)
{
   Ansi2Unicode(sString, wString, 0)
   Unicode2Ansi(wString, zString, 65001)
   Return zString
}

Ansi2Unicode(ByRef sString, ByRef wString, CP = 0)
{
     nSize := DllCall("MultiByteToWideChar"
      , "Uint", CP
      , "Uint", 0
      , "Uint", &sString
      , "int",  -1
      , "Uint", 0
      , "int",  0)

   VarSetCapacity(wString, nSize * 2)

   DllCall("MultiByteToWideChar"
      , "Uint", CP
      , "Uint", 0
      , "Uint", &sString
      , "int",  -1
      , "Uint", &wString
      , "int",  nSize)
}

Unicode2Ansi(ByRef wString, ByRef sString, CP = 0)
{
     nSize := DllCall("WideCharToMultiByte"
      , "Uint", CP
      , "Uint", 0
      , "Uint", &wString
      , "int",  -1
      , "Uint", 0
      , "int",  0
      , "Uint", 0
      , "Uint", 0)

   VarSetCapacity(sString, nSize)

   DllCall("WideCharToMultiByte"
      , "Uint", CP
      , "Uint", 0
      , "Uint", &wString
      , "int",  -1
      , "str",  sString
      , "int",  nSize
      , "Uint", 0
      , "Uint", 0)
}

2

Re: AHK: Преобразование кодировки файла, упакованного в CHM

Почему такой код работает?

#SingleInstance Force

fPath = C:\WINDOWS\Help\clipbrd.chm  ; Путь для XP

URL := "mk:@MSITStore:" fPath "::/whatis_intro_cb.htm"

req := ComObjCreate("Msxml2.XMLHTTP.6.0")
req.open("GET", URL, 0)
req.send
ResponseText := req.responseText
req := ""

MsgBox, % RegExReplace(ResponseText, "is).*?<title>(.*)?</title>.*", "$1")

3

Re: AHK: Преобразование кодировки файла, упакованного в CHM

Но ведь из ANSI в UTF-8 не конвертит?

4 (изменено: creature.ws, 2013-05-12 18:46:38)

Re: AHK: Преобразование кодировки файла, упакованного в CHM

Я намекаю, что «не работает» ни о чём не говорит. Пример кода из сообщения #2, будучи запущенным на win xp; ahk 1.1.10 unicode, отображает сообщение «ClipBook Viewer overview». Необходимости в преобразовании кодировки нет.

5 (изменено: DD, 2013-05-12 19:10:19)

Re: AHK: Преобразование кодировки файла, упакованного в CHM

А у меня выводит содержимое файла 'whatis_intro_cb.htm' до закрывающего тэга 'BODY', без кириллицы.

6 (изменено: creature.ws, 2013-05-12 19:13:45)

Re: AHK: Преобразование кодировки файла, упакованного в CHM

И в чём, по-вашему, причина подобного поведения?

7

Re: AHK: Преобразование кодировки файла, упакованного в CHM

Тайна сия велика есть).
Ось?

8 (изменено: creature.ws, 2013-05-12 21:13:41)

Re: AHK: Преобразование кодировки файла, упакованного в CHM

Вам виднее, не возьмусь угадывать.

Для тех, кого в тему приведёт гугл:
Если данные в переменной можно интерпретировать как строку в определённой кодировке, то представить их в приемлемом виде можно с помощью функции StrGet.

9

Re: AHK: Преобразование кодировки файла, упакованного в CHM

Для тех, кого в тему приведёт яндекс:
Как без помех вывести кириллический ANSI текст (стало быть, преобразовав в UTF-8)?

10 (изменено: creature.ws, 2013-05-12 22:03:22)

Re: AHK: Преобразование кодировки файла, упакованного в CHM

Как без помех вывести кириллический ANSI текст

Предположим, в переменной var строка в cp 1251

strget(&var, "CP1251")

(стало быть, преобразовав в UTF-8)?

Почему нужно преобразовывать в UTF-8? Строки в unicode версии Autohotkey в CP1200.

11

Re: AHK: Преобразование кодировки файла, упакованного в CHM

creature.ws пишет:

Строки в unicode версии Autohotkey в CP1200.

UTF-16 то есть?

12

Re: AHK: Преобразование кодировки файла, упакованного в CHM

UTF-16LE Code Page Identifiers

13

Re: AHK: Преобразование кодировки файла, упакованного в CHM

Все равно затрудняюсь. Странно что нигде готового кода нет, ни у нас, ни там.

14

Re: AHK: Преобразование кодировки файла, упакованного в CHM

Странно что нигде готового кода нет, ни у нас, ни там.

Кажется, вы ищете «то, не знаю что».

15

Re: AHK: Преобразование кодировки файла, упакованного в CHM

Ну искал-то я знамо что: кодик, способный вывести из ANSI файла кириллический текст. Остальное — детали.
Но вам, я погляжу, видней.

16

Re: AHK: Преобразование кодировки файла, упакованного в CHM

Как «перекодировать» строку из cp1251 в cp1200 показано в сообщении #10, какие еще вопросы?

17

Re: AHK: Преобразование кодировки файла, упакованного в CHM

fPath = C:\WINDOWS\Help\clipbrd.chm  ; Путь для XP

URL := "mk:@MSITStore:" fPath "::/whatis_intro_cb.htm"

req := ComObjCreate("Msxml2.XMLHTTP.6.0")
req.open("GET", URL, 0)
req.send
ResponseText := req.responseText
req := ""

strget(&ResponseText, "CP1251")

MsgBox, % RegExReplace(ResponseText, "s).*?<title>(.*)?</title>.*", "$1")

Неа, не катит. Ведь говорил, затрудняюсь.

18

Re: AHK: Преобразование кодировки файла, упакованного в CHM

Где здесь ошибка закралась?


#SingleInstance Force

fPath = C:\WINDOWS\Help\clipbrd.chm  ; Путь для XP

URL := "mk:@MSITStore:" fPath "::/whatis_intro_cb.htm"

req := ComObjCreate("Msxml2.XMLHTTP.6.0")
req.open("GET", URL, 0)
req.send
ResponseText := req.responseText
req := ""

chck := StrPutVar(ResponseText,ResponseText,"CP1251")

MsgBox, % RegExReplace(chck, "s).*?<title>(.*)?</title>.*", "$1")


StrPutVar(string, ByRef var, encoding)
{
    ; Ensure capacity.
    VarSetCapacity( var, StrPut(string, encoding)
        ; StrPut returns char count, but VarSetCapacity needs bytes.
        * ((encoding="utf-16"||encoding="cp1200") ? 2 : 1) )
    ; Copy or convert the string.
    return StrPut(string, &var, encoding)
}

19 (изменено: creature.ws, 2013-05-17 16:23:05)

Re: AHK: Преобразование кодировки файла, упакованного в CHM

StrPut returns the number of characters written, the required buffer size in characters if no Address was given, or 0 if an error occurred. If Length is less than the length of the source string, the function fails and returns 0. If Length is exactly the length of the source string, the string is not null-terminated; otherwise the returned count includes the null-terminator.

Вы ищете строку <title> в chck. chck в лучшем случае содержит число.

Где здесь ошибка закралась?

Нет здесь ошибок, просто случайный набор команд обрабатывает разнообразные строки и возвращает разнообразные результаты. Код написан с использованием паттерна «корабль в бутылке».

20

Re: AHK: Преобразование кодировки файла, упакованного в CHM

То есть, надежда заиметь кораблик в бутылке всё же есть .
Встряхнуть её не откажетесь?

21 (изменено: creature.ws, 2013-05-17 17:03:06)

Re: AHK: Преобразование кодировки файла, упакованного в CHM

Откажусь. Код из второго сообщения у меня на win xp работает как и предполагается. Почему у вас «не работает» — вы не говорите.

То есть, надежда [..] всё же есть

Надежда на прочих посетителей форума.

22

Re: AHK: Преобразование кодировки файла, упакованного в CHM

creature.ws пишет:

Откажусь. Код из второго сообщения у меня на wind xp работает как и предполагается. Почему у вас «не работает» — вы не говорите.

В смысле кириллицу демонстрирует?
Если так, то дело в другом. Спасибо.

23

Re: AHK: Преобразование кодировки файла, упакованного в CHM

В смысле у меня win xp не локализирована. И страница whatis_intro_cb.htm сохранена в кодировке 1252 и содержит лишь латиницу. И этот факт не противоречит формулировке вашего вопроса в первом сообщении.

24

Re: AHK: Преобразование кодировки файла, упакованного в CHM

А уточняющие последующие не принимаются? В любом случае, не по адресу. Забудем.

25 (изменено: creature.ws, 2013-05-17 17:21:17)

Re: AHK: Преобразование кодировки файла, упакованного в CHM

«Забудем» после вопросительного предложения не к месту
В последующих уточнениях вы не упоминали ни версию используемого интерпретатора, ни указанную в файле whatis_intro_cb.htm кодировку. Вы считаете, что предоставленной вами информации достаточно — ожидайте того, кто считает так же.

26

Re: AHK: Преобразование кодировки файла, упакованного в CHM

creature.ws пишет:

В последующих уточнениях вы не упоминали ни версию используемого интерпретатора, ни указанную в файле whatis_intro_cb.htm кодировку.

Я вроде уточнял, что HTML-файл ансишный, а версия последняя, само собой.

creature.ws пишет:

«Забудем» после вопросительного предложения не к месту

Но после риторического — в самый раз. Но забудем .

27 (изменено: creature.ws, 2013-05-17 18:45:28)

Re: AHK: Преобразование кодировки файла, упакованного в CHM

Теперь понятно, что вы считаете единственной ANSI кодировкой CP1251, но даже википедия не согласна. Мне больше нечего сказать в этой теме.

28

Re: AHK: Преобразование кодировки файла, упакованного в CHM

Но в "charset" файла значилась именно "1251". Не думаю, что занятие особым расщепыванием ANSI возможностей здесь имеет смысл.