UTF-8: рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдФрд░ рдбрд┐рдХреЛрдбрд┐рдВрдЧ

рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдХрд┐ рдпреВрдЯреАрдПрдл -8 рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпреВрдирд┐рдХреЛрдб рдХреНрдпрд╛ рд╣реИ, рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рд╡реАрдмреАрдПрд╕рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдпреВрдЯреАрдПрдл -8 рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реИред рдФрд░ рдЬрдм рд╕реЗ рдореБрдЭреЗ рдХреБрдЫ рднреА рдХрд╛рдо рдирд╣реАрдВ рдорд┐рд▓рд╛, рдореБрдЭреЗ рдЦреБрдж рдХреЛ рдмрдВрджреВрдХ рдкрд░ рд░рдЦрдирд╛ рдкрдбрд╝рд╛ред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдЕрдиреБрднрд╡ рд╡реИрд╕реЗ рднреА рдЙрдкрдпреЛрдЧреА рд╣реИред рдПрдХ рдмреЗрд╣рддрд░ рд╕рдордЭ рдХреЗ рд▓рд┐рдП, рдореИрдВ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реВрдБрдЧрд╛ред

рдпреВрдирд┐рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ


рдпреВрдирд┐рдХреЛрдб рд╕реЗ рдкрд╣рд▓реЗ, 8-рдмрд┐рдЯ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХрд╛ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдореБрдЦреНрдп рдиреБрдХрд╕рд╛рди рд╕реНрдкрд╖реНрдЯ рд╣реИрдВ:

рдЗрд╕рд▓рд┐рдП "рд╡реНрдпрд╛рдкрдХ" рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХрд╛ рдПрдХ рдПрдХрд▓ рдорд╛рдирдХ рдмрдирд╛рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛, рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рд╡рд░реНрдг рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗ (рдФрд░ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рд╡реЗ рдЗрд╕рдореЗрдВ рдХреЗрд╡рд▓ рд╕рд╛рдзрд╛рд░рдг рд╡рд░реНрдгреЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЕрдкрдиреЗ рджрд┐рдорд╛рдЧ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рдФрд░ рд╡рд┐рджреЗрд╢реА рд▓реЛрдЧреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛)ред рдпреВрдирд┐рдХреЛрдб рдореЗрдВ 1,112,064 рдХреЛрдб рдкреЛрдЬреАрд╢рди (16 рд╕реЗ рдЕрдзрд┐рдХ рдмрд┐рдЯреНрд╕) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╢реБрд░реБрдЖрдд ASCII рдХреА рдирдХрд▓ рдХрд░рддреА рд╣реИ, рдФрд░ рдлрд┐рд░ рд╢реЗрд╖ рд▓реИрдЯрд┐рди рд╡рд░реНрдгрдорд╛рд▓рд╛, рд╕рд┐рд░рд┐рд▓рд┐рдХ, рдФрд░ рдЕрдиреНрдп рдпреВрд░реЛрдкреАрдп рдФрд░ рдПрд╢рд┐рдпрд╛рдИ рд╡рд░реНрдгреЛрдВ рдХреАред рдЪрд░рд┐рддреНрд░ рдкрджрдирд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ 65 k рдХреЗ рд▓рд┐рдП "U + xxxx" рдлреЙрд░реНрдо рдХреЗ рд╣реЗрдХреНрд╕рд╛рдбреЗрд╕рд┐рдорд▓ рдиреЛрдЯреЗрд╢рди рдФрд░ рдмрд╛рдХреА рдХреЗ рд▓рд┐рдП рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЕрдВрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

UTF-8 рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ


рдПрдХ рдмрд╛рд░ рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдпреВрдирд┐рдХреЛрдб рд╣реИ, рд▓реЗрдХрд┐рди рдпреВрдЯреАрдПрдл -8 рд╣реИред рдмрд╛рдж рдореЗрдВ рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдореИрдВ рдЧрд▓рдд рдерд╛ред
UTF-8 рдпреВрдирд┐рдХреЛрдб рдХрд╛ рдХреЗрд╡рд▓ 8-рдмрд┐рдЯ рд░реВрдк рдореЗрдВ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред 128 рд╕реЗ рдХрдо рдХреЛрдб рд╡рд╛рд▓реЗ рд╡рд░реНрдгреЛрдВ рдХреЛ рдПрдХ рдмрд╛рдЗрдЯ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЪреВрдВрдХрд┐ рдпреВрдирд┐рдХреЛрдб рдореЗрдВ рд╡реЗ ASCII рдХреЛ рджреЛрд╣рд░рд╛рддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рдЗрди рдЕрдХреНрд╖рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦреЗ рдЧрдП рдкрд╛рда ASCII рдореЗрдВ рдкрд╛рда рд╣реЛрдВрдЧреЗред 128 рдХреЗ рдХреЛрдб рд╡рд╛рд▓реЗ рдкреНрд░рддреАрдХреЛрдВ рдХреЛ 2 рдмрд╛рдЗрдЯреНрд╕ рджреНрд╡рд╛рд░рд╛ рдПрдиреНрдХреЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ 2048 - 3 рдХреЗ рдХреЛрдб 65536 - 4 рдХреЗ рдХреЛрдб рд╣реИрдВред рдЗрд╕рд▓рд┐рдП 6 рдмрд╛рдЗрдЯреНрд╕ рддрдХ рдкрд╣реБрдВрдЪрдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рд╕рд╛рде рд╕рд╛рдВрдХреЗрддрд┐рдХ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдмрджрд▓рдирд╛ рдХреБрдЫ рднреА рдирд╣реАрдВред
 0x00000000 - 0x0000007F: 0xxxxxxx
 0x00000080 - 0x000007FF: 110xxxxx 10xxxxxx
 0x00000800 - 0x0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
 0x00010000 - 0x001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx


UTF-8 рдореЗрдВ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ


рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд▓рдЧрднрдЧ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИ:

Function EncodeUTF8(s) Dim i, c, utfc, b1, b2, b3 For i=1 to Len(s) c = ToLong(AscW(Mid(s,i,1))) If c < 128 Then utfc = chr( c) ElseIf c < 2048 Then b1 = c Mod &h40 b2 = (c - b1) / &h40 utfc = chr(&hC0 + b2) & chr(&h80 + b1) ElseIf c < 65536 And (c < 55296 Or c > 57343) Then b1 = c Mod &h40 b2 = ((c - b1) / &h40) Mod &h40 b3 = (c - b1 - (&h40 * b2)) / &h1000 utfc = chr(&hE0 + b3) & chr(&h80 + b2) & chr(&h80 + b1) Else '     UTF-16 utfc = Chr(&hEF) & Chr(&hBF) & Chr(&hBD) End If EncodeUTF8 = EncodeUTF8 + utfc Next End Function Function ToLong(intVal) If intVal < 0 Then ToLong = CLng(intVal) + &H10000 Else ToLong = CLng(intVal) End If End Function 


рдпреВрдЯреАрдПрдл -8 рдХреЛ рдбрд┐рдХреЛрдб рдХрд░реЗрдВ



 Function DecodeUTF8(s) Dim i, c, n, b1, b2, b3 i = 1 Do While i <= len(s) c = asc(mid(s,i,1)) If (c and &hC0) = &hC0 Then n = 1 Do While i + n <= len(s) If (asc(mid(s,i+n,1)) and &hC0) <> &h80 Then Exit Do End If n = n + 1 Loop If n = 2 and ((c and &hE0) = &hC0) Then b1 = asc(mid(s,i+1,1)) and &h3F b2 = c and &h1F c = b1 + b2 * &h40 Elseif n = 3 and ((c and &hF0) = &hE0) Then b1 = asc(mid(s,i+2,1)) and &h3F b2 = asc(mid(s,i+1,1)) and &h3F b3 = c and &h0F c = b3 * &H1000 + b2 * &H40 + b1 Else '   U+FFFF    c = &hFFFD End if s = left(s,i-1) + chrw( c) + mid(s,i+n) Elseif (c and &hC0) = &h80 then '    s = left(s,i-1) + chrw(&hFFFD) + mid(s,i+1) End If i = i + 1 Loop DecodeUTF8 = s End Function 


рд╕рдВрджрд░реНрдн


рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдкрд░ рдпреВрдирд┐рдХреЛрдб
ASP + VBScript рдХрд╛ рд╕реНрд░реЛрдд

UPD : рддреНрд░реБрдЯрд┐ рдЕрдиреБрдХреНрд░рдо рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдФрд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдкреВрд░реНрдгрд╛рдВрдХ, рдЬреЛ AscW рджреЗрддрд╛ рд╣реИред

Source: https://habr.com/ru/post/In138173/


All Articles