1

Тема: AHK: Регулярные выражения

Всем здравствуйте, решил разобрать данные из переменные при помощи регулярок.


out := "xyz;zyx;yxz"
Value := RegExReplace(out, "(.*);")
Value2 := RegExReplace(out, "")  ; С этой строкой проблемы.
Value3 := RegExReplace(out, ";(.*)")
MsgBox, % Value "`n" Value2 "`n" Value3

В общем то не могу вытащить текст из середины. Может кто поможет :-)

2

Re: AHK: Регулярные выражения

См. здесь.

out := "xyz;zyx;yxz"
RegExMatch(out, "^(.*);(.*);(.*)", match)
MsgBox % match1 "`n" match2 "`n" match3

3

Re: AHK: Регулярные выражения

Спасибо, сначала тоже попробовал через RegExMatch, но не указал начало строки.

4 (изменено: DD, 2016-04-24 19:15:08)

Re: AHK: Регулярные выражения

Как в функции UnHTM() можно задействовать замену множественных пробелов — одним? —


UnHTM( HTM ) { ; Remove HTML formatting / Convert to ordinary text     by SKAN 19-Nov-2009
 Static HT     ; Forum Topic: www.autohotkey.com/forum/topic51342.html
 IfEqual,HT,,   SetEnv,HT, % "&aacuteá&acircâ&acute´&aeligæ&agraveà&amp&aringå&atildeã&au"
 . "mlä&bdquo„&brvbar¦&bull•&ccedilç&cedil¸&cent¢&circˆ&copy©&curren¤&dagger†&dagger‡&deg"
 . "°&divide÷&eacuteé&ecircê&egraveè&ethð&eumlë&euro€&fnofƒ&frac12½&frac14¼&frac34¾&gt>&h"
 . "ellip…&iacuteí&icircî&iexcl¡&igraveì&iquest¿&iumlï&laquo«&ldquo“&lsaquo‹&lsquo‘&lt<&m"
 . "acr¯&mdash—&microµ&middot·&nbsp &ndash–&not¬&ntildeñ&oacuteó&ocircô&oeligœ&ograveò&or"
 . "dfª&ordmº&oslashø&otildeõ&oumlö&para¶&permil‰&plusmn±&pound£&quot""&raquo»&rdquo”&reg"
 . "®&rsaquo›&rsquo’&sbquo‚&scaronš&sect§&shy&sup1¹&sup2²&sup3³&szligß&thornþ&tilde˜&tim"
 . "es×&trade™&uacuteú&ucircû&ugraveù&uml¨&uumlü&yacuteý&yen¥&yumlÿ"

 HTM := RegExReplace( HTM,"&amp;(\w+;)", "&$1" )   ; для обработки &amp;lt;
 HTM := RegExReplace( HTM,"&amp;(#\d+;)", "&$1" )  ; для обработки &amp;#60;
 TXT := RegExReplace( HTM,"<[^>]+>", " " )               ; Remove all tags between  "<" and ">"
 Loop, Parse, TXT, &`;                              ; Create a list of special characters
   L := "&" A_LoopField ";", R .= (!(A_Index&1)) ? ( (!InStr(R,L,1)) ? L:"" ) : ""
 StringTrimRight, R, R, 1
 Loop, Parse, R , `;                                ; Parse Special Characters
  If F := InStr( HT, A_LoopField )                  ; Lookup HT Data
    StringReplace, TXT,TXT, %A_LoopField%`;, % SubStr( HT,F+StrLen(A_LoopField), 1 ), All
  Else If ( SubStr( A_LoopField,2,1)="#" )
    StringReplace, TXT, TXT, %A_LoopField%`;, % Chr(SubStr(A_LoopField,3)), All

;HTM := RegExReplace(HTM, "\s+", "\s")

Return RegExReplace( TXT, "(^\s*|\s*$)")            ; Remove leading/trailing white spaces
}


; Example:
HTM = 
(
&agrave; &#224; à латинская строчная a с тупым ударением  
&aacute; &##225; á латинская строчная a с острым ударением  
&acirc; &##226; â латинская строчная a с диакритическим знаком  
&atilde; &#227; ã латинская строчная a с тильдой  
&auml; &#228; ä латинская строчная a с двумя точками  
&aring; &#229; å латинская строчная a с верхним кружком  

<a href="/intl/en/ads/">Advertising   <span style='font-size:10.0pt;font-family:"Arial Unicode MS"'>&nbsp;!    &pound; </span>Progr&lt;ams&gt;</a>
<TABLE border=1>
<TBODY>
<TR>
<TH>Имя</TH><TH>Код</TH><TH>Вид</TH><TH>Описание</TH>
<TR>
<TD>&amp;quot;<TD>&amp;#34;<TD>&quot;<TD>двойная кавычка
<TR>
<TD>&amp;amp;<TD>&amp;#38;<TD>&amp;<TD>амперсанд
<TR>
<TD>&amp;lt;<TD>&amp;#60;<TD>&lt;<TD>знак 'меньше'
<TR>
<TD>&amp;gt;<TD>&amp;#62;<TD>&gt;<TD>знак 'больше'
<TR>
<TD>&amp;nbsp;<TD>&amp;#160;<TD>&nbsp;<TD>неразрывный пробел
)
MsgBox, % UnHTM( HTM )

5

Re: AHK: Регулярные выражения

;HTM := RegExReplace(HTM, "\s+", "\s")

на

TXT := RegExReplace(TXT, " +", " ")
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui
+ DD

6 (изменено: DD, 2016-04-24 18:26:12)

Re: AHK: Регулярные выражения

Спасибо! Тут по ходу выяснилось, что следующий пример делает в точности то же, что и функция UnHTM(). Так понимаю, это стало возможно после поддержки COM и прежний вариант неактуален? Является ли этот последний надёжным в отношении всех версий Windows?


HTM = 
(
<a href="/intl/en/ads/">Advertising            Programs</a>
&agrave; &#224; à латинская строчная a с тупым ударением  
&aacute; &##225; á латинская строчная a с острым ударением  
&acirc; &##226; â латинская строчная a с диакритическим знаком  
&atilde; &#227; ã латинская строчная a с тильдой  
&auml; &#228; ä латинская строчная a с двумя точками  
&aring; &#229; å латинская строчная a с верхним кружком  

<a href="/intl/en/ads/">Advertising   <span style='font-size:10.0pt;font-family:"Arial Unicode MS"'>&nbsp;!    &pound; </span>Progr&lt;ams&gt;</a>
<TABLE border=1>
<TBODY>
<TR>
<TH>Имя</TH><TH>Код</TH><TH>Вид</TH><TH>Описание</TH>
<TR>
<TD>&amp;quot;<TD>&amp;#34;<TD>&quot;<TD>двойная кавычка
<TR>
<TD>&amp;amp;<TD>&amp;#38;<TD>&amp;<TD>амперсанд
<TR>
<TD>&amp;lt;<TD>&amp;#60;<TD>&lt;<TD>знак 'меньше'
<TR>
<TD>&amp;gt;<TD>&amp;#62;<TD>&gt;<TD>знак 'больше'
<TR>
<TD>&amp;nbsp;<TD>&amp;#160;<TD>&nbsp;<TD>неразрывный пробел
)

MsgBox, % ComUnHTML( HTM )

ComUnHTML(html) {
	oHTML := ComObjCreate("HtmlFile")
	oHTML.write(html)
	return oHTML.documentElement.innerText
}

7 (изменено: DD, 2016-04-24 19:14:08)

Re: AHK: Регулярные выражения

Всё-таки, остановлюсь на первом — из-за настраиваемости обработки. Но возник вопрос: почему COM-код верно выводит символ &pound;, а старый код — нет?


HTM = <a href="/intl/en/ads/">Advertising - &pound; Progr&lt;ams&gt;</a>

MsgBox, % ComUnHTML( HTM )
MsgBox, % UnHTM( HTM )

ComUnHTML(html) {
	oHTML := ComObjCreate("HtmlFile")
	oHTML.write(html)
	return oHTML.documentElement.innerText
}

UnHTM( HTM ) { ; Remove HTML formatting / Convert to ordinary text     by SKAN 19-Nov-2009
   Static HT     ; Forum Topic: www.autohotkey.com/forum/topic51342.html
   IfEqual,HT,,   SetEnv,HT, % "&aacuteá&acircâ&acute´&aeligæ&agraveà&amp&aringå&atildeã&au"
 . "mlä&bdquo„&brvbar¦&bull•&ccedilç&cedil¸&cent¢&circˆ&copy©&curren¤&dagger†&dagger‡&deg"
 . "°&divide÷&eacuteé&ecircê&egraveè&ethð&eumlë&euro€&fnofƒ&frac12½&frac14¼&frac34¾&gt>&h"
 . "ellip…&iacuteí&icircî&iexcl¡&igraveì&iquest¿&iumlï&laquo«&ldquo“&lsaquo‹&lsquo‘&lt<&m"
 . "acr¯&mdash—&microµ&middot·&nbsp &ndash–&not¬&ntildeñ&oacuteó&ocircô&oeligœ&ograveò&or"
 . "dfª&ordmº&oslashø&otildeõ&oumlö&para¶&permil‰&plusmn±&pound£&quot""&raquo»&rdquo”&reg"
 . "®&rsaquo›&rsquo’&sbquo‚&scaronš&sect§&shy&sup1¹&sup2²&sup3³&szligß&thornþ&tilde˜&tim"
 . "es×&trade™&uacuteú&ucircû&ugraveù&uml¨&uumlü&yacuteý&yen¥&yumlÿ"

   HTM := RegExReplace( HTM,"&amp;(\w+;)", "&$1" )   ;!! для обработки &amp;lt;
   HTM := RegExReplace( HTM,"&amp;(#\d+;)", "&$1" )  ;!! для обработки &amp;#60;
   TXT := RegExReplace( HTM,"<[^>]+>", " " )               ; Remove all tags between  "<" and ">"
   Loop, Parse, TXT, &`;                              ; Create a list of special characters
      L := "&" A_LoopField ";", R .= (!(A_Index&1)) ? ( (!InStr(R,L,1)) ? L:"" ) : ""
   StringTrimRight, R, R, 1
   Loop, Parse, R , `;                                ; Parse Special Characters
      If F := InStr( HT, A_LoopField )                  ; Lookup HT Data
         StringReplace, TXT,TXT, %A_LoopField%`;, % SubStr( HT,F+StrLen(A_LoopField), 1 ), All
   Else If ( SubStr( A_LoopField,2,1)="#" )
      StringReplace, TXT, TXT, %A_LoopField%`;, % Chr(SubStr(A_LoopField,3)), All

   TXT := RegExReplace(TXT, " +", " ")  ;!! множественные пробелы на один

   Return RegExReplace( TXT, "(^\s*|\s*$)")            ; Remove leading/trailing white spaces
}

8

Re: AHK: Регулярные выражения

С этой функцией работает.

UnHTM( HTM ) { ; Remove HTML formatting / Convert to ordinary text     by SKAN 19-Nov-2009
 Static HT     ; Forum Topic: www.autohotkey.com/forum/topic51342.html
 IfEqual,HT,,   SetEnv,HT, % "&aacuteá&acircâ&acute´&aeligæ&agraveà&amp&aringå&atildeã&au"
 . "mlä&bdquo„&brvbar¦&bull•&ccedilç&cedil¸&cent¢&circˆ&copy©&curren¤&dagger†&dagger‡&deg"
 . "°&divide÷&eacuteé&ecircê&egraveè&ethð&eumlë&euro€&fnofƒ&frac12½&frac14¼&frac34¾&gt>&h"
 . "ellip…&iacuteí&icircî&iexcl¡&igraveì&iquest¿&iumlï&laquo«&ldquo“&lsaquo‹&lsquo‘&lt<&m"
 . "acr¯&mdash—&microµ&middot·&nbsp &ndash–&not¬&ntildeñ&oacuteó&ocircô&oeligœ&ograveò&or"
 . "dfª&ordmº&oslashø&otildeõ&oumlö&para¶&permil‰&plusmn±&pound£&quot""&raquo»&rdquo”&reg"
 . "®&rsaquo›&rsquo’&sbquo‚&scaronš&sect§&shy&sup1¹&sup2²&sup3³&szligß&thornþ&tilde˜&tim"
 . "es×&trade™&uacuteú&ucircû&ugraveù&uml¨&uumlü&yacuteý&yen¥&yumlÿ"
 TXT := RegExReplace( HTM,"<[^>]+>" )               ; Remove all tags between  "<" and ">"
 Loop, Parse, TXT, &`;                              ; Create a list of special characters
   L := "&" A_LoopField ";", R .= (!(A_Index&1)) ? ( (!InStr(R,L,1)) ? L:"" ) : ""
 StringTrimRight, R, R, 1
 Loop, Parse, R , `;                                ; Parse Special Characters
  If F := InStr( HT, A_LoopField )                  ; Lookup HT Data
    StringReplace, TXT,TXT, %A_LoopField%`;, % SubStr( HT,F+StrLen(A_LoopField), 1 ), All
  Else If ( SubStr( A_LoopField,2,1)="#" )
    StringReplace, TXT, TXT, %A_LoopField%`;, % Chr(SubStr(A_LoopField,3)), All
Return RegExReplace( TXT, "(^\s*|\s*$)")            ; Remove leading/trailing white spaces
}
+ DD

9

Re: AHK: Регулярные выражения

делает в точности то же, что и функция UnHTM().

У меня другое выводит:

à à à латинская строчная a с тупым ударением á &##225; á латинская строчная a с острым ударением â &##226; â латинская строчная a с диакритическим знаком ã ã ã латинская строчная a с тильдой ä ä ä латинская строчная a с двумя точками å å å латинская строчная a с верхним кружком Advertising  ! £ Progr<ams> ИмяКодВидОписание

&quot;&#34;"двойная кавычка

&amp;&#38;&амперсанд

&lt;&#60;<знак 'меньше'

&gt;&#62;>знак 'больше'

&nbsp;&#160; неразрывный пробел

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

10 (изменено: DD, 2016-04-24 19:28:34)

Re: AHK: Регулярные выражения

Malcev пишет:

С этой функцией работает.

Значит, я её криво скопировал, благодарю)) Отредактировал посты.

11 (изменено: DD, 2016-04-24 19:27:37)

Re: AHK: Регулярные выражения

serzh82saratov

Я в первую функцию две строки добавлял, для правки следующих частых случаев: &amp;lt; или &amp;#60;, — на &lt; или &#60;. Наверно поэтому несоответствия.

12

Re: AHK: Регулярные выражения

Ещё обнаружилась та же проблема с числовыми кодами (между СОМ-кодом и старым):


HTM = 
(
&#167; § параграф 
&#169; © знак охраны авторского права (copyright) 
&#174; ® символ зарегистрированного товарного знака 
&#153; ™ символ товарного знака 
&#176; ° знак градуса 
&laquo; « левая кавычка (левая ёлочка) 
&raquo; » правая кавычка (правая ёлочка) 
&#133; … многоточие 
&#146; ’ апостроф 
&#132; „ открывающая лапка 
&#147; “ закрывающая лапка 
&#147; “ открывающая английская лапка 
&#148; ” закрывающая английская лапка 
&#149; • жирная точка 
&#150; – короткое тире (см. одноименный § 158) 
&minus; − минус 
&#177; ± плюс-минус 
&#151; — тире 
&#8470; № знак номера 
)

MsgBox, % ComUnHTML( HTM )
MsgBox, % UnHTM( HTM )

ComUnHTML(html) {
	oHTML := ComObjCreate("HtmlFile")
	oHTML.write(html)
	return oHTML.documentElement.innerText
}

UnHTM( HTM ) { ; Remove HTML formatting / Convert to ordinary text     by SKAN 19-Nov-2009
   Static HT     ; Forum Topic: www.autohotkey.com/forum/topic51342.html
   IfEqual,HT,,   SetEnv,HT, % "&aacuteá&acircâ&acute´&aeligæ&agraveà&amp&aringå&atildeã&au"
 . "mlä&bdquo„&brvbar¦&bull•&ccedilç&cedil¸&cent¢&circˆ&copy©&curren¤&dagger†&dagger‡&deg"
 . "°&divide÷&eacuteé&ecircê&egraveè&ethð&eumlë&euro€&fnofƒ&frac12½&frac14¼&frac34¾&gt>&h"
 . "ellip…&iacuteí&icircî&iexcl¡&igraveì&iquest¿&iumlï&laquo«&ldquo“&lsaquo‹&lsquo‘&lt<&m"
 . "acr¯&mdash—&microµ&middot·&nbsp &ndash–&not¬&ntildeñ&oacuteó&ocircô&oeligœ&ograveò&or"
 . "dfª&ordmº&oslashø&otildeõ&oumlö&para¶&permil‰&plusmn±&pound£&quot""&raquo»&rdquo”&reg"
 . "®&rsaquo›&rsquo’&sbquo‚&scaronš&sect§&shy&sup1¹&sup2²&sup3³&szligß&thornþ&tilde˜&tim"
 . "es×&trade™&uacuteú&ucircû&ugraveù&uml¨&uumlü&yacuteý&yen¥&yumlÿ"
   ;HTM := RegExReplace( HTM,"&amp;(\w+;)", "&$1" )   ;!! для обработки &amp;lt;
   ;HTM := RegExReplace( HTM,"&amp;(#\d+;)", "&$1" )  ;!! для обработки &amp;#60;
   TXT := RegExReplace( HTM,"<[^>]+>", " " )               ; Remove all tags between  "<" and ">"
   Loop, Parse, TXT, &`;                              ; Create a list of special characters
      L := "&" A_LoopField ";", R .= (!(A_Index&1)) ? ( (!InStr(R,L,1)) ? L:"" ) : ""
   StringTrimRight, R, R, 1
   Loop, Parse, R , `;                                ; Parse Special Characters
      If F := InStr( HT, A_LoopField )                  ; Lookup HT Data
         StringReplace, TXT,TXT, %A_LoopField%`;, % SubStr( HT,F+StrLen(A_LoopField), 1 ), All
   Else If ( SubStr( A_LoopField,2,1)="#" )
      StringReplace, TXT, TXT, %A_LoopField%`;, % Chr(SubStr(A_LoopField,3)), All
   ;TXT := RegExReplace(TXT, " +", " ")  ;!! множественные пробелы на один
   Return RegExReplace( TXT, "(^\s*|\s*$)")            ; Remove leading/trailing white spaces
}

13 (изменено: DD, 2016-04-29 01:49:54)

Re: AHK: Регулярные выражения

Выяснил, что старый код — для ANSI и попробовал перекодировать как у teadrinker. Ведь что-то не так делаю? —


HTM = 
(
&#167; § параграф 
&#169; © знак охраны авторского права (copyright) 
&#174; ® символ зарегистрированного товарного знака 
&#153; ™ символ товарного знака 
&#176; ° знак градуса 
&laquo; « левая кавычка (левая ёлочка) 
&raquo; » правая кавычка (правая ёлочка) 
&#133; … многоточие 
&#146; ’ апостроф 
&#132; „ открывающая лапка 
&#147; “ закрывающая лапка 
&#147; “ открывающая английская лапка 
&#148; ” закрывающая английская лапка 
&#149; • жирная точка 
&#150; – короткое тире (см. одноименный § 158) 
&minus; − минус 
&#177; ± плюс-минус 
&#151; — тире 
&#8470; № знак номера 
)

;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      t := UnHTM(UnSlashUnicode(HTM))
      ; split long line to smaller lines about 40-50 symbols length
      ;t := RegExReplace(t,".{40,50}(\s)","$0`n")

MsgBox, % t
;MsgBox, % ComUnHTML( HTM )
;MsgBox, % UnHTM( HTM )

ComUnHTML(html) {
	oHTML := ComObjCreate("HtmlFile")
	oHTML.write(html)
	return oHTML.documentElement.innerText
}

UnHTM( HTM ) { ; Remove HTML formatting / Convert to ordinary text     by SKAN 19-Nov-2009
   Static HT     ; Forum Topic: www.autohotkey.com/forum/topic51342.html
   IfEqual,HT,,   SetEnv,HT, % "&aacuteá&acircâ&acute´&aeligæ&agraveà&amp&aringå&atildeã&au"
 . "mlä&bdquo„&brvbar¦&bull•&ccedilç&cedil¸&cent¢&circˆ&copy©&curren¤&dagger†&dagger‡&deg"
 . "°&divide÷&eacuteé&ecircê&egraveè&ethð&eumlë&euro€&fnofƒ&frac12½&frac14¼&frac34¾&gt>&h"
 . "ellip…&iacuteí&icircî&iexcl¡&igraveì&iquest¿&iumlï&laquo«&ldquo“&lsaquo‹&lsquo‘&lt<&m"
 . "acr¯&mdash—&microµ&middot·&nbsp &ndash–&not¬&ntildeñ&oacuteó&ocircô&oeligœ&ograveò&or"
 . "dfª&ordmº&oslashø&otildeõ&oumlö&para¶&permil‰&plusmn±&pound£&quot""&raquo»&rdquo”&reg"
 . "®&rsaquo›&rsquo’&sbquo‚&scaronš&sect§&shy&sup1¹&sup2²&sup3³&szligß&thornþ&tilde˜&tim"
 . "es×&trade™&uacuteú&ucircû&ugraveù&uml¨&uumlü&yacuteý&yen¥&yumlÿ"
   ;HTM := RegExReplace( HTM,"&amp;(\w+;)", "&$1" )   ;!! для обработки &amp;lt;
   ;HTM := RegExReplace( HTM,"&amp;(#\d+;)", "&$1" )  ;!! для обработки &amp;#60;
   TXT := RegExReplace( HTM,"<[^>]+>", " " )               ; Remove all tags between  "<" and ">"
   Loop, Parse, TXT, &`;                              ; Create a list of special characters
      L := "&" A_LoopField ";", R .= (!(A_Index&1)) ? ( (!InStr(R,L,1)) ? L:"" ) : ""
   StringTrimRight, R, R, 1
   Loop, Parse, R , `;                                ; Parse Special Characters
      If F := InStr( HT, A_LoopField )                  ; Lookup HT Data
         StringReplace, TXT,TXT, %A_LoopField%`;, % SubStr( HT,F+StrLen(A_LoopField), 1 ), All
   Else If ( SubStr( A_LoopField,2,1)="#" )
      StringReplace, TXT, TXT, %A_LoopField%`;, % Chr(SubStr(A_LoopField,3)), All
   ;TXT := RegExReplace(TXT, " +", " ")  ;!! множественные пробелы на один
   Return RegExReplace( TXT, "(^\s*|\s*$)")            ; Remove leading/trailing white spaces
}

;---------------------------------------
; Convert strings
;---------------------------------------

/*
CP_ACP   = 0
CP_OEMCP = 1
CP_MACCP = 2
CP_UTF7  = 65000
CP_UTF8  = 65001
*/

Ansi2Oem(sString)
{
   Ansi2Unicode(sString, wString, 0)
   Unicode2Ansi(wString, zString, 1)
   Return zString
}

Oem2Ansi(zString)
{
   Ansi2Unicode(zString, wString, 1)
   Unicode2Ansi(wString, sString, 0)
   Return sString
}

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

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

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)
}

;-------------------------------------------------
; HTML encode/decode
;------------------------------------------------

UriEncode(str)
{ ; v 0.3 / (w) 24.06.2008 by derRaphael / zLib-Style release
   b_Format := A_FormatInteger
   data := ""
   SetFormat,Integer,H
   Loop,Parse,str
      if ((Asc(A_LoopField)>0x7f) || (Asc(A_LoopField)<0x30) || (asc(A_LoopField)=0x3d))
         data .= "%" . ((StrLen(c:=SubStr(ASC(A_LoopField),3))<2) ? "0" . c : c)
      Else
         data .= A_LoopField
   SetFormat,Integer,%b_format%
   return data
}

UriDecode(str)
{ ; v 0.1 / (w) 28.06.2008 by derRaphael / zLib-Style release
   Loop,Parse,str,`%
      txt := (A_Index=1) ? A_LoopField : txt chr("0x" substr(A_LoopField,1,2)) SubStr(A_LoopField,3)
   return txt
}

UnSlashUnicode(s)
{
  ; unslash unicode sequences like \u0026
  ; by Mikhail Kuropyatnikov 2009 (micdelt@mail.ru)
   rx = \\u([0-9a-fA-F]{4})
   pos = 0

   loop
   {
   pos := RegExMatch(s,rx,m,pos+1)
   if (pos = 0)
      break
   StringReplace, s, s, %m%, % Chr("0x" . SubStr(m,3,4))
   }
   
   return s
}