.Net, UTF-16 рдФрд░ рдирд┐рдпрдорд┐рдд рдПрдХреНрд╕рдкреНрд░реЗрд╢рди

рдХрд┐рд╕реА рддрд░рд╣ рдореБрдЭреЗ рдпрд╣ рдЬрд╛рдБрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ XML рдирд╛рдо рд╕рд╣реА рд╣реИ рдпрд╛ рдирд╣реАрдВред рдХреНрдпрд╛ рдЖрд╕рд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рд╣рдо рдорд╛рдирдХ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ , рдЬрд╣рд╛рдВ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡рд░реНрдгрд┐рдд рд╣реИ рдХрд┐ рдХрд┐рди рдкреНрд░рддреАрдХреЛрдВ рдХреЗ рд╕рд╛рде рдирд╛рдо рд╢реБрд░реВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдпрд╣ рдЬрд╛рд░реА рд░рд╣ рд╕рдХрддрд╛ рд╣реИ, рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╣реИ:

[4] NameStartChar ::= ":" | [AZ] | "_" | [az] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
[4a] NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
[5] Name ::= NameStartChar (NameChar)*


рд▓рдЧрднрдЧ рддреИрдпрд╛рд░ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐, рдЖрд╕рд╛рди рдлрд╝рд╛рдЗрд▓ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг Ctrl + H ...

public const string NameStartCharPattern = @"\:|[AZ]|_|[az]|[\u00C0-\u00D6]|[\u00D8-\u00F6]|[\u00F8-\u02FF]|[\u0370-\u037D]|[\u037F-\u1FFF]|[\u200C-\u200D]|[\u2070-\u218F]|[\u2C00-\u2FEF]|[\u3001-\uD7FF]|[\uF900-\uFDCF]|[\uFDF0-\uFFFD]|[\u10000-\uEFFFF]" ;
public const string NameCharPattern = NameStartCharPattern + @"|-|\.|[0-9]|\u00B7|[\u0300-\u036F]|[\u203F-\u2040]" ;
public const string NamePattern = @"(?:" + NameStartCharPattern + @")(?:" + NameCharPattern + @")*" ;

* This source code was highlighted with Source Code Highlighter .


рд╣рдо рдПрдХ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ ...
Assert.That(Regex.Match( "4a" , Patterns.NamePattern), Is.False);
* This source code was highlighted with Source Code Highlighter .

рд╕рд╛рдл, рд╕рд░рд▓, рд╕реНрдкрд╖реНрдЯ ... рдлреЗрд▓!

рдмреБрд░рд╛рдИ рдХреА рдЬрдбрд╝ рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдореЗрдВ рдЕрдВрддрд┐рдо рдШрдЯрдХ рд╣реИ: [\ u10000- \ uEFFFF]ред рд╡рд╣ рд╕рднреА рдкрд╛рддреНрд░реЛрдВ рдХреЛ рдкрдХрдбрд╝рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрд╕реЗ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП ... рдмрдВрдж рдХрд░реЛ, рд╡рд╣ рдХреИрд╕реЗ рдкрдХрдбрд╝рддрд╛ рд╣реИ? рд╣рдорд╛рд░реЗ рдкрд╛рд╕ UTF-16 рд╣реИ, рдЪрд░рд┐рддреНрд░ рджреЛ рдмрд╛рдЗрдЯреНрд╕ рддрдХ рд╕реАрдорд┐рдд рд╣реИ? .. рдпрд╛ рдпрд╣ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИ?

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

рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдпреВрдирд┐рдХреЛрдб рдореЗрдВ 65536 рд╕реЗ рдЕрдзрд┐рдХ рд╡рд░реНрдгреЛрдВ рдХреЛ рдХреВрдЯрдмрджреНрдз рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред рдпреВрдирд┐рдХреЛрдб рд╡рд░реНрдг рддрдерд╛рдХрдерд┐рдд рд╡рд┐рдорд╛рдиреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реИрдВ, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ 0x10000 рд╡рд░реНрдгреЛрдВ рдХреА рдХреНрд╖рдорддрд╛ рд╡рд╛рд▓рд╛ рд╣реИред рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рдорд╛рдирдХ рдЙрдиреНрд╣реЗрдВ 17 рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдРрд╕рд╛ "рд╡рдХреНрд░" рдпрд╣рд╛рдВ рдмрд┐рдирд╛ рдХрд╛рд░рдг рдХреЗ рдирд╣реАрдВ рд╣реИ: рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╡рд┐рдорд╛рди рд╣реИ рдЬреЛ рдПрдХ рддрд░рд╣ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ рджреВрд╕рд░реЗ рдореЗрдВ 16ред рдкрд╣рд▓рд╛, рддрдерд╛рдХрдерд┐рдд рдмреБрдирд┐рдпрд╛рджреА рдмрд╣реБрднрд╛рд╖реА рд╡рд┐рдорд╛рди, рдЬрд┐рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдмреАрдПрдордкреА рдХреЗ рддрд╣рдд рднреА рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рдореЗрдВ рдЖрдЬ рдЗрд╕реНрддреЗрдорд╛рд▓ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдкреНрд░рддреАрдХреЛрдВ рдХрд╛ рд╡рд┐рд╢рд╛рд▓ рдмрд╣реБрдордд рд╣реИред UTF-16 рдореЗрдВ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХрд░рддреЗ рд╕рдордп рдЙрд╕рдореЗрдВ рд╕реЗ рд╕рднреА рд╡рд░реНрдг, рджреЛ рдмрд╛рдЗрдЯ рдореЗрдВ, рдПрдХ рд╢рдмреНрдж рдореЗрдВ, рд╕реАрдзреЗ рдЙрди рдореЗрдВ рд╡рд░реНрдг рдХреЛрдб рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд▓рд┐рдЦреЗ рдЬрд╛рддреЗ рд╣реИрдВред рдХреЛрдб рдХреА рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╢реНрд░реЗрдгреА, 0xD800-0xDFFF, рдПрдХ рд╣реА рд╡рд┐рдорд╛рди рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреА рдЧрдИ рд╣реИред рдЗрд╕рдореЗрдВ 2048 рдорд╛рди рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рд╕рд░реЛрдЧреЗрдЯреНрд╕ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдкрдиреЗ рдЖрдк рд╕реЗ, рдЗрди рдореВрд▓реНрдпреЛрдВ рдХреЛ UTF-16 рдореЗрдВ рдирд╣реАрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рдЬреЛрдбрд╝реЗ рдореЗрдВ - рджреЛ рд╢рдмреНрдж (рджреЛ рдмрд╛рдЗрдЯреНрд╕) рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реЛрд▓рд╣ рдкреИрдирд▓реЛрдВ рд╕реЗ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдорд╛рди рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ: 0x10000 рд╡рд░реНрдг рдХреЛрдб рд╕реЗ рдШрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╣рдореЗрдВ рдПрдХ рд╕рд╛рдл рдмреАрд╕-рдмрд┐рдЯ рд╕рдВрдЦреНрдпрд╛ рджреЗрддрд╛ рд╣реИред рдЗрди 20 рдмрд┐рдЯреНрд╕ рдХреЛ рдкрд╣рд▓реЗ рдФрд░ рджреВрд╕рд░реЗ рд╢рдмреНрдж рдореЗрдВ 10 рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ 2048 рдЪрдпрдирд┐рдд рдХреЛрдб рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЪреВрдБрдХрд┐ рдкрд╣рд▓рд╛ рд╢рдмреНрдж рдЙрдкрд╕рд░реНрдЧ 0b110110 (рдорд╛рди 0xD800-0xDBFF рджреЗрддреЗ рд╕рдордп, рдЙрдЪреНрдЪ рдпрд╛ рдЕрдЧреНрд░рдгреА рд╕рд░реЛрдЧреЗрдЯ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ) рдХреЗ рд╕рд╛рде рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдХреНрд░рдорд╢рдГ 0b110111 (0xDC00-0xDFFF, рдЕрдВрддрд┐рдо рдпрд╛ рдирд┐рдореНрди рд╕рд░реЛрдЧреЗрдЯ) рд╣реИ, рдпрд╣ рд╢рдмреНрдж рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдирд┐рд░реНрдзрд╛рд░рдг рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИред рд╕рдВрджрд░реНрдн рдХреЗ рдЖрдзрд╛рд░ рдкрд░ред

... рддреЛ, рдпрд╣ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред рдиреЗрдЯ? рдФрд░ рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕рд░реЛрдЧреЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдг рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЗрдВрдЬрди рдЙрдиреНрд╣реЗрдВ рдЕрдирджреЗрдЦрд╛ рдХрд░рддрд╛ рд╣реИред рдпрд╛рдиреА рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЙрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ, рдЙрдирдХреЗ рд╕рд╛рде рдкрд╛рддреНрд░реЛрдВ рдХреЗ рдЬреЛрдбрд╝реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдореИрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдкрд╣рд▓рд╛ рд╡реНрдпрдХреНрддрд┐ рдирд╣реАрдВ рдерд╛ред рдлрд┐рд░ рд╕реЗ, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, Microsoft рдХрд╛ рдирд┐рд░реНрдгрдп "рдареАрдХ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред"

рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рдЗрд╕рдХреЗ рд╕рд╛рде рд░рд╣рдирд╛ рд╣реЛрдЧрд╛ред рдЬреИрд╕рд╛ рдХрд┐ рдмрдЧреНрд░реЗрдкреЛрд░реНрдЯ рдореЗрдВ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, PInvoke рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЙрд▓ рдХрд░реЗрдВ - рдЧреМрд░реИрдпрд╛ рдХреЗ рд╕рд╛рде рддреЛрдк рд╕реЗред рджреВрд╕рд░рд╛ рд╡рд┐рдЪрд╛рд░ - рдЗрди рд╕рд░реЛрдЧреЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рдирд░рдХ рдХреЗ рд▓рд┐рдП рдореЛрд╣рдХ рдерд╛, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рд╣рд╛рд░ рдирд╣реАрдВ рдорд╛рдирдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ ... рдФрд░ рдлрд┐рд░ рдореБрдЭреЗ рдЕрдЪрд╛рдирдХ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдмрдЧ рдХреЛ рдПрдХ рдлреАрдЪрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ!

рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рд░реЛрдЧреЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рдореВрд╣ рдХреА рд╕рдВрд░рдЪрдирд╛ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рд╣реИ - рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдкрд╣рд▓реЗ 14 рд╡рд┐рдорд╛рдиреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рднреА рдкрд╛рддреНрд░ рдХреЛ рдЕрдВрддрд┐рдо рджреЛ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ ... рдЕрд░реНрдерд╛рдд, рдпрд╣ рдПрдХ рдЙрдЪреНрдЪ рд╢реНрд░реЗрдгреА рдХреЗ рдХреНрд╖реЗрддреНрд░ рд╕реЗ рдореВрд▓реНрдпреЛрдВ рдХреА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реАрдорд╛ рдХреЛ рдордирд╛ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рд╕рд╛рде рдЕрдкрдиреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ:
[\u10000-\uEFFFF] -> (?:[\uD800-\uDB7F][\uDC00-\uDFFF])

рдпрд╣ рд╡рд┐рдзрд┐ рдмрд╣реБрдд рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЙрдирд╕реЗ рд╡рд░реНрдгреЛрдВ рдХреА рд╕рдВрдХреАрд░реНрдг рд╕реАрдорд╛рдПрдВ рдкреВрдЫрдирд╛ рдмрд╣реБрдд рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛, рдпрд╣ рдореБрдЭреЗ рд╕реБрдВрджрд░ рд▓рдЧрд╛, рдФрд░ рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕реЗ рдЖрдкрдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред

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


All Articles