Тема: AHK: Конвертер юникодных символов в HTML-код
Имеется ли конвертер юникодных символов со страницы — в HTML-код? К примеру, это — «ω», на это — «ω»?
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Имеется ли конвертер юникодных символов со страницы — в HTML-код? К примеру, это — «ω», на это — «ω»?
string = ω
Transform, out, HTML, % string, 2
MsgBox % out
А если требуется обработать все юникодные символы, а не конкретный? Их для этого все надо указать?
Для конвертации символов в виде кода, было так:
msgbox % JavaEscapedToHtml("\u00bbtest\u00bb")
JavaEscapedToHtml(s) {
i := 1
while j := RegExMatch(s, "\\u[A-Fa-f0-9]{1,4}", m, i)
e .= SubStr(s, i, j-i) Chr("0x" SubStr(m, 3)), i := j + StrLen(m)
Transform, OutputVar, HTML, % e . SubStr(s, i)
return OutputVar
}
А если требуется обработать все юникодные символы, а не конкретный? Их для этого все надо указать?
В справке по этой команде всё написано.
Спасибо, удалось приспособить код Деда Мазая, но при этом обрабатывается также кириллица и удаляются пробелы. Как задать исключения, или конвертировать только собственно юникодные символы, а не те, что могут нормально отображаться и в ANSI-кодировке?
;http://forum.script-coding.com/viewtopic.php?pid=7971#p7971
; UNICODE Encryption
n = 1 ; задать порядковый номер читаемого символа буфера обмена
F4::
StringLen, i, Clipboard ; определить длину строки в буфере обмена -> %i%
Loop, %i% ; повторять процесс согласно количества символов в строке буфера обмена
{
StringMid, Symbol, Clipboard, %n%, 1 ; прочитать один символ из строки буфера обмена, начиная с первого -> %Symbol%
Transform, UNICODE, HTML, %Symbol%, 2 ; перекодировать полученный символ в код HTML
Code = %UNICODE% ; добавить фигурные скобки
Done = %Done%%Code% ; добавить полученное в конец строки переменной -> %Done%
n += 1 ; увеличить число на единицу, для чтения следующего символа буфера обмена
}
Clipboard = %Done% ; вернуть итоговые данные в буфер обмена
Done = ; очистить переменную Done для последующего использования
n = 1 ; вернуть номер читаемого символа на единицу
SplashTextOn, 400, 180, UNICODE Encryption, `n`n All job done`n successfully ; сообщение об успешном завершении работы
Sleep, 500
SplashTextOff
Return
Как исключить в примере кириллицу и пробелы?
exclude:="а, "
str =
(
#. ;а
)
n = 1 ; задать порядковый номер читаемого символа буфера обмена
StringLen, i, str ; определить длину строки в буфере обмена -> %i%
Loop, %i% ; повторять процесс согласно количества символов в строке буфера обмена
{
StringMid, Symbol, str, %n%, 1 ; прочитать один символ из строки буфера обмена, начиная с первого -> %Symbol%
;If Symbol in % exclude ;If ( Symbol = " " )
; Continue
Transform, UNICODE, HTML, %Symbol%, 2 ; перекодировать полученный символ в код HTML
Done = %Done%%UNICODE% ; добавить полученное в конец строки переменной -> %Done%
n += 1 ; увеличить число на единицу, для чтения следующего символа буфера обмена
}
msgbox %Done%
n = 1 ; вернуть номер читаемого символа на единицу
Return
Понять как работает код и составить условие.
Условие вы составили, осталось понять работу скрипта.
Дык если б понял — и вопрос не стоял, потому и требуется намёк)).
А что именно непонятно, там же все расписано.
Скрипт перебирает посимвольно буфер обмена, перекодирует каждый символ и добавляет его к переменной Done.
Это все можно заменить Loop, Parse.
Почему пробел не добавляет к переменной Done? Как сделать, чтобы не затрагивался не-юникод, ведь все равно нельзя будет перечислить все символы, которые не следует обрабатывать?
Вот так можно:
MsgBox, % AnsiTestChar("ω") . "`n" . AnsiTestChar("ё")
AnsiTestChar(char) {
VarSetCapacity(buff, 1, 0)
StrPut(char, &buff, "cp0")
Return StrGet(&buff, 1, "cp0") == char
}
Что тут не так сделано? —
str =
(
# ё`.....;
)
n = 1 ; задать порядковый номер читаемого символа буфера обмена
StringLen, i, str ; определить длину строки в буфере обмена -> %i%
Loop, %i% ; повторять процесс согласно количества символов в строке буфера обмена
{
StringMid, char, str, %n%, 1 ; прочитать один символ из строки буфера обмена, начиная с первого -> %char%
AnsiTestChar(char)
if not (char == 1)
Transform, UNICODE, HTML, %char%, 2 ; перекодировать полученный символ в код HTML
Done = %Done%%UNICODE% ; добавить полученное в конец строки переменной -> %Done%
n += 1 ; увеличить число на единицу, для чтения следующего символа буфера обмена
}
msgbox %Done%
n = 1 ; вернуть номер читаемого символа на единицу
Return
AnsiTestChar(char) {
VarSetCapacity(buff, 1, 0)
StrPut(char, &buff, "cp0")
Return StrGet(&buff, 1, "cp0") == char
}
str := "Кириллица ω"
MsgBox, % ConvertToHtml(str)
ConvertToHtml(str) {
Loop, parse, str
{
if AnsiTestChar(A_LoopField)
htmlStr .= A_LoopField
else {
Transform, out, HTML, % A_LoopField, 2
htmlStr .= out
}
}
Return htmlStr
}
AnsiTestChar(char) {
VarSetCapacity(buff, 1, 0)
StrPut(char, &buff, "cp0")
Return StrGet(&buff, "cp0") == char
}
Спасибо в юникоде!
Как произвести обратную конвертацию из буквальных символов — в код в формате из скрипта?
HTM =
(
à
á
â
ã
ä
å
ïîäåëèëñÿ ïóáëèêàöèåé
)
MsgBox, % ComUnHTML( HTM )
ComUnHTML(html) {
oHTML := ComObjCreate("HtmlFile")
oHTML.write(html)
return oHTML.documentElement.innerText
}
Лично мне вопрос непонятен.
Имелось в виду, что скрипт выше конвертирует символьный код вида &xxxх; — на символы в буквальном виде, кириллицу и т.п. А хотелось бы обратного результата, чтобы кириллица и т.п., из буквального вида — конвертировалась в символьный код в формате &xxxх;, как в переменной скрипта.
Нужно это для формирования пунктов дерева TOC формата HTML Help (CHM), в котором любые символы в Юникоде или в любом другом HTML-формате, отображаются как знаки вопросов.
Читайте внимательно команду transform.
Уже пробовал, экспериментировал с флагами, но Юникод не обрабатывается:
str =
(
ωωωωω
Кириллица Kirillitsa
"&<>
)
MsgBox, % ConvertToHtml(str)
ConvertToHtml(str) {
Loop, parse, str
{
;if AnsiTestChar(A_LoopField)
; htmlStr .= A_LoopField
;else {
Transform, out, HTML, % A_LoopField
htmlStr .= out
;}
}
Return htmlStr
}
AnsiTestChar(char) {
VarSetCapacity(buff, 1, 0)
StrPut(char, &buff, "cp0")
Return StrGet(&buff, "cp0") == char
}
Просто, наверное, в исходнике не для всех символов прописаны имена, а только числа.
Так как такой код тоже не трансформирует
oHTML := ComObjCreate("HTMLFile")
p := oHTML.createElement("p")
p.innerText := "я"
msgbox % p.innerHTML
то можете создать свой парсер, который будет заменять уже все символы.
https://www.w3.org/TR/html5/syntax.html … references
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться