diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln
index 28574eee21..289cdf8dcb 100644
--- a/HttpAbstractions.sln
+++ b/HttpAbstractions.sln
@@ -1,4 +1,3 @@
-
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 14
VisualStudioVersion = 14.0.23107.0
@@ -39,8 +38,6 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Extensions.WebEnc
EndProject
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Extensions.WebEncoders.Tests", "test\Microsoft.Extensions.WebEncoders.Tests\Microsoft.Extensions.WebEncoders.Tests.xproj", "{7AE2731D-43CD-4CF8-850A-4914DE2CE930}"
EndProject
-Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Extensions.WebEncoders.Core", "src\Microsoft.Extensions.WebEncoders.Core\Microsoft.Extensions.WebEncoders.Core.xproj", "{BE9112CB-D87D-4080-9CC3-24492D49CBE6}"
-EndProject
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Html.Abstractions", "src\Microsoft.AspNet.Html.Abstractions\Microsoft.AspNet.Html.Abstractions.xproj", "{68A28E4A-3ADE-4187-9625-4FF185887CB3}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{982F09D8-621E-4872-BA7B-BBDEA47D1EFD}"
@@ -231,18 +228,6 @@ Global
{7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Release|x86.ActiveCfg = Release|Any CPU
{7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Release|x86.Build.0 = Release|Any CPU
- {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Debug|x86.ActiveCfg = Debug|Any CPU
- {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Debug|x86.Build.0 = Debug|Any CPU
- {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Release|Any CPU.Build.0 = Release|Any CPU
- {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Release|x86.ActiveCfg = Release|Any CPU
- {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Release|x86.Build.0 = Release|Any CPU
{68A28E4A-3ADE-4187-9625-4FF185887CB3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{68A28E4A-3ADE-4187-9625-4FF185887CB3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{68A28E4A-3ADE-4187-9625-4FF185887CB3}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
@@ -324,7 +309,6 @@ Global
{E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21}
{DD2CE416-765E-4000-A03E-C2FF165DA1B6} = {A5A15F1C-885A-452A-A731-B0173DDBD913}
{7AE2731D-43CD-4CF8-850A-4914DE2CE930} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21}
- {BE9112CB-D87D-4080-9CC3-24492D49CBE6} = {A5A15F1C-885A-452A-A731-B0173DDBD913}
{68A28E4A-3ADE-4187-9625-4FF185887CB3} = {A5A15F1C-885A-452A-A731-B0173DDBD913}
{1D0764B4-1DEB-4232-A714-D4B7E846918A} = {982F09D8-621E-4872-BA7B-BBDEA47D1EFD}
{2D187B88-94BD-4A39-AC97-F8F8B9363301} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21}
diff --git a/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs b/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs
index ef7f932226..5b1164b438 100644
--- a/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs
+++ b/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs
@@ -5,7 +5,7 @@ using System;
using System.Diagnostics;
using System.Globalization;
using System.IO;
-using Microsoft.Extensions.WebEncoders;
+using System.Text.Encodings.Web;
namespace Microsoft.AspNet.Html.Abstractions
{
@@ -197,7 +197,7 @@ namespace Microsoft.AspNet.Html.Abstractions
_value = value;
}
- public void WriteTo(TextWriter writer, IHtmlEncoder encoder)
+ public void WriteTo(TextWriter writer, HtmlEncoder encoder)
{
writer.Write(_value);
}
@@ -234,7 +234,7 @@ namespace Microsoft.AspNet.Html.Abstractions
_args = args;
}
- public void WriteTo(TextWriter writer, IHtmlEncoder encoder)
+ public void WriteTo(TextWriter writer, HtmlEncoder encoder)
{
if (writer == null)
{
@@ -269,10 +269,10 @@ namespace Microsoft.AspNet.Html.Abstractions
// https://msdn.microsoft.com/en-us/library/system.string.format(v=vs.110).aspx#Format6_Example
private class EncodingFormatProvider : IFormatProvider, ICustomFormatter
{
- private readonly IHtmlEncoder _encoder;
+ private readonly HtmlEncoder _encoder;
private readonly IFormatProvider _formatProvider;
- public EncodingFormatProvider(IFormatProvider formatProvider, IHtmlEncoder encoder)
+ public EncodingFormatProvider(IFormatProvider formatProvider, HtmlEncoder encoder)
{
Debug.Assert(formatProvider != null);
Debug.Assert(encoder != null);
@@ -306,7 +306,7 @@ namespace Microsoft.AspNet.Html.Abstractions
var result = customFormatter.Format(format, arg, _formatProvider);
if (result != null)
{
- return _encoder.HtmlEncode(result);
+ return _encoder.Encode(result);
}
}
@@ -320,7 +320,7 @@ namespace Microsoft.AspNet.Html.Abstractions
var result = formattable.ToString(format, _formatProvider);
if (result != null)
{
- return _encoder.HtmlEncode(result);
+ return _encoder.Encode(result);
}
}
@@ -330,7 +330,7 @@ namespace Microsoft.AspNet.Html.Abstractions
var result = arg.ToString();
if (result != null)
{
- return _encoder.HtmlEncode(result);
+ return _encoder.Encode(result);
}
}
diff --git a/src/Microsoft.AspNet.Html.Abstractions/IHtmlContent.cs b/src/Microsoft.AspNet.Html.Abstractions/IHtmlContent.cs
index 05f09cb7b4..d9b7099710 100644
--- a/src/Microsoft.AspNet.Html.Abstractions/IHtmlContent.cs
+++ b/src/Microsoft.AspNet.Html.Abstractions/IHtmlContent.cs
@@ -2,7 +2,7 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.IO;
-using Microsoft.Extensions.WebEncoders;
+using System.Text.Encodings.Web;
namespace Microsoft.AspNet.Html.Abstractions
{
@@ -16,7 +16,7 @@ namespace Microsoft.AspNet.Html.Abstractions
/// to the specified .
///
/// The to which the content is written.
- /// The which encodes the content to be written.
- void WriteTo(TextWriter writer, IHtmlEncoder encoder);
+ /// The which encodes the content to be written.
+ void WriteTo(TextWriter writer, HtmlEncoder encoder);
}
}
\ No newline at end of file
diff --git a/src/Microsoft.AspNet.Html.Abstractions/project.json b/src/Microsoft.AspNet.Html.Abstractions/project.json
index 9fe9c36612..86a35720b2 100644
--- a/src/Microsoft.AspNet.Html.Abstractions/project.json
+++ b/src/Microsoft.AspNet.Html.Abstractions/project.json
@@ -9,10 +9,15 @@
"warningsAsErrors": true
},
"dependencies": {
- "Microsoft.Extensions.WebEncoders.Core": "1.0.0-*"
+ "System.Text.Encodings.Web": "4.0.0-beta-*"
},
"frameworks": {
- "net451": {},
+ "net451": {
+ "frameworkAssemblies": {
+ "System.IO": "",
+ "System.Runtime": ""
+ }
+ },
"dotnet5.4": {
"dependencies": {
"System.Resources.ResourceManager": "4.0.1-beta-*"
diff --git a/src/Microsoft.AspNet.Http.Abstractions/PathString.cs b/src/Microsoft.AspNet.Http.Abstractions/PathString.cs
index f9538e7444..ebcc9b107e 100644
--- a/src/Microsoft.AspNet.Http.Abstractions/PathString.cs
+++ b/src/Microsoft.AspNet.Http.Abstractions/PathString.cs
@@ -3,7 +3,7 @@
using System;
using System.Linq;
-using Microsoft.Extensions.WebEncoders;
+using System.Text.Encodings.Web;
namespace Microsoft.AspNet.Http
{
@@ -66,7 +66,7 @@ namespace Microsoft.AspNet.Http
public string ToUriComponent()
{
// TODO: Measure the cost of this escaping and consider optimizing.
- return HasValue ? string.Join("/", _value.Split('/').Select(UrlEncoder.Default.UrlEncode)) : string.Empty;
+ return HasValue ? string.Join("/", _value.Split('/').Select(UrlEncoder.Default.Encode)) : string.Empty;
}
///
diff --git a/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs b/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs
index 25ba1f2699..af2feeedb5 100644
--- a/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs
+++ b/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs
@@ -4,8 +4,8 @@
using System;
using System.Collections.Generic;
using System.Text;
+using System.Text.Encodings.Web;
using Microsoft.Extensions.Primitives;
-using Microsoft.Extensions.WebEncoders;
namespace Microsoft.AspNet.Http
{
@@ -119,7 +119,16 @@ namespace Microsoft.AspNet.Http
/// The resulting QueryString
public static QueryString Create(string name, string value)
{
- return new QueryString("?" + UrlEncoder.Default.UrlEncode(name) + '=' + UrlEncoder.Default.UrlEncode(value));
+ if (name == null)
+ {
+ throw new ArgumentNullException(nameof(name));
+ }
+ if (value == null)
+ {
+ throw new ArgumentNullException(nameof(value));
+ }
+
+ return new QueryString("?" + UrlEncoder.Default.Encode(name) + '=' + UrlEncoder.Default.Encode(value));
}
///
@@ -135,9 +144,9 @@ namespace Microsoft.AspNet.Http
{
builder.Append(first ? "?" : "&");
first = false;
- builder.Append(UrlEncoder.Default.UrlEncode(pair.Key));
+ builder.Append(UrlEncoder.Default.Encode(pair.Key));
builder.Append("=");
- builder.Append(UrlEncoder.Default.UrlEncode(pair.Value));
+ builder.Append(UrlEncoder.Default.Encode(pair.Value));
}
return new QueryString(builder.ToString());
@@ -158,9 +167,9 @@ namespace Microsoft.AspNet.Http
{
builder.Append(first ? "?" : "&");
first = false;
- builder.Append(UrlEncoder.Default.UrlEncode(pair.Key));
+ builder.Append(UrlEncoder.Default.Encode(pair.Key));
builder.Append("=");
- builder.Append(UrlEncoder.Default.UrlEncode(value));
+ builder.Append(UrlEncoder.Default.Encode(value));
}
}
@@ -184,6 +193,15 @@ namespace Microsoft.AspNet.Http
public QueryString Add(string name, string value)
{
+ if (name == null)
+ {
+ throw new ArgumentNullException(nameof(name));
+ }
+ if (value == null)
+ {
+ throw new ArgumentNullException(nameof(value));
+ }
+
if (!HasValue || Value.Equals("?", StringComparison.Ordinal))
{
return Create(name, value);
@@ -191,9 +209,9 @@ namespace Microsoft.AspNet.Http
var builder = new StringBuilder(Value);
builder.Append("&");
- builder.Append(UrlEncoder.Default.UrlEncode(name));
+ builder.Append(UrlEncoder.Default.Encode(name));
builder.Append("=");
- builder.Append(UrlEncoder.Default.UrlEncode(value));
+ builder.Append(UrlEncoder.Default.Encode(value));
return new QueryString(builder.ToString());
}
diff --git a/src/Microsoft.AspNet.Http.Abstractions/project.json b/src/Microsoft.AspNet.Http.Abstractions/project.json
index 8c0d539da3..8810641078 100644
--- a/src/Microsoft.AspNet.Http.Abstractions/project.json
+++ b/src/Microsoft.AspNet.Http.Abstractions/project.json
@@ -14,13 +14,19 @@
"type": "build",
"version": "1.0.0-*"
},
- "Microsoft.Extensions.WebEncoders.Core": "1.0.0-*"
+ "System.Text.Encodings.Web": "4.0.0-beta-*"
},
"frameworks": {
- "net451": {},
+ "net451": {
+ "frameworkAssemblies": {
+ "System.IO": "",
+ "System.Runtime": ""
+ }
+ },
"dotnet5.4": {
"dependencies": {
"System.Collections": "4.0.11-beta-*",
+ "System.ComponentModel": "4.0.1-beta-*",
"System.Diagnostics.Tools": "4.0.1-beta-*",
"System.Globalization": "4.0.11-beta-*",
"System.Globalization.Extensions": "4.0.1-beta-*",
@@ -38,4 +44,4 @@
}
}
}
-}
\ No newline at end of file
+}
diff --git a/src/Microsoft.AspNet.Http.Extensions/QueryBuilder.cs b/src/Microsoft.AspNet.Http.Extensions/QueryBuilder.cs
index 060c04efc7..ec4ae68fec 100644
--- a/src/Microsoft.AspNet.Http.Extensions/QueryBuilder.cs
+++ b/src/Microsoft.AspNet.Http.Extensions/QueryBuilder.cs
@@ -4,7 +4,7 @@
using System.Collections;
using System.Collections.Generic;
using System.Text;
-using Microsoft.Extensions.WebEncoders;
+using System.Text.Encodings.Web;
namespace Microsoft.AspNet.Http.Extensions
{
@@ -45,9 +45,9 @@ namespace Microsoft.AspNet.Http.Extensions
var pair = _params[i];
builder.Append(first ? "?" : "&");
first = false;
- builder.Append(UrlEncoder.Default.UrlEncode(pair.Key));
+ builder.Append(UrlEncoder.Default.Encode(pair.Key));
builder.Append("=");
- builder.Append(UrlEncoder.Default.UrlEncode(pair.Value));
+ builder.Append(UrlEncoder.Default.Encode(pair.Value));
}
return builder.ToString();
diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json
index 5cc71ea727..c0adfdc59e 100644
--- a/src/Microsoft.AspNet.Http.Extensions/project.json
+++ b/src/Microsoft.AspNet.Http.Extensions/project.json
@@ -10,7 +10,6 @@
},
"dependencies": {
"Microsoft.AspNet.Http.Abstractions": "1.0.0-*",
- "Microsoft.Extensions.WebEncoders.Core": "1.0.0-*",
"Microsoft.Net.Http.Headers": "1.0.0-*"
},
"frameworks": {
@@ -23,4 +22,4 @@
}
}
}
-}
\ No newline at end of file
+}
diff --git a/src/Microsoft.AspNet.Http/ResponseCookies.cs b/src/Microsoft.AspNet.Http/ResponseCookies.cs
index e67251f61a..5075efb004 100644
--- a/src/Microsoft.AspNet.Http/ResponseCookies.cs
+++ b/src/Microsoft.AspNet.Http/ResponseCookies.cs
@@ -3,8 +3,8 @@
using System;
using System.Linq;
+using System.Text.Encodings.Web;
using Microsoft.Extensions.Primitives;
-using Microsoft.Extensions.WebEncoders;
using Microsoft.Net.Http.Headers;
namespace Microsoft.AspNet.Http.Internal
@@ -38,8 +38,8 @@ namespace Microsoft.AspNet.Http.Internal
public void Append(string key, string value)
{
var setCookieHeaderValue = new SetCookieHeaderValue(
- UrlEncoder.Default.UrlEncode(key),
- UrlEncoder.Default.UrlEncode(value))
+ UrlEncoder.Default.Encode(key),
+ UrlEncoder.Default.Encode(value))
{
Path = "/"
};
@@ -61,8 +61,8 @@ namespace Microsoft.AspNet.Http.Internal
}
var setCookieHeaderValue = new SetCookieHeaderValue(
- UrlEncoder.Default.UrlEncode(key),
- UrlEncoder.Default.UrlEncode(value))
+ UrlEncoder.Default.Encode(key),
+ UrlEncoder.Default.Encode(value))
{
Domain = options.Domain,
Path = options.Path,
@@ -80,7 +80,7 @@ namespace Microsoft.AspNet.Http.Internal
///
public void Delete(string key)
{
- var encodedKeyPlusEquals = UrlEncoder.Default.UrlEncode(key) + "=";
+ var encodedKeyPlusEquals = UrlEncoder.Default.Encode(key) + "=";
Func predicate = value => value.StartsWith(encodedKeyPlusEquals, StringComparison.OrdinalIgnoreCase);
StringValues deleteCookies = encodedKeyPlusEquals + "; expires=Thu, 01-Jan-1970 00:00:00 GMT";
@@ -107,7 +107,7 @@ namespace Microsoft.AspNet.Http.Internal
throw new ArgumentNullException(nameof(options));
}
- var encodedKeyPlusEquals = UrlEncoder.Default.UrlEncode(key) + "=";
+ var encodedKeyPlusEquals = UrlEncoder.Default.Encode(key) + "=";
bool domainHasValue = !string.IsNullOrEmpty(options.Domain);
bool pathHasValue = !string.IsNullOrEmpty(options.Path);
diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json
index cc8ecdc60c..e60dfd06d6 100644
--- a/src/Microsoft.AspNet.Http/project.json
+++ b/src/Microsoft.AspNet.Http/project.json
@@ -19,7 +19,8 @@
"dotnet5.4": {
"dependencies": {
"System.Diagnostics.Debug": "4.0.11-beta-*",
- "System.Text.Encoding": "4.0.11-beta-*"
+ "System.Text.Encoding": "4.0.11-beta-*",
+ "System.Threading": "4.0.11-beta-*"
}
}
}
diff --git a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs
index 465ce48a83..57ee90bc75 100644
--- a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs
+++ b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs
@@ -4,8 +4,8 @@
using System;
using System.Collections.Generic;
using System.Text;
+using System.Text.Encodings.Web;
using Microsoft.Extensions.Primitives;
-using Microsoft.Extensions.WebEncoders;
namespace Microsoft.AspNet.WebUtilities
{
@@ -92,9 +92,9 @@ namespace Microsoft.AspNet.WebUtilities
foreach (var parameter in queryString)
{
sb.Append(hasQuery ? '&' : '?');
- sb.Append(UrlEncoder.Default.UrlEncode(parameter.Key));
+ sb.Append(UrlEncoder.Default.Encode(parameter.Key));
sb.Append('=');
- sb.Append(UrlEncoder.Default.UrlEncode(parameter.Value));
+ sb.Append(UrlEncoder.Default.Encode(parameter.Value));
hasQuery = true;
}
diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json
index 93b5d00c98..e7878e15a7 100644
--- a/src/Microsoft.AspNet.WebUtilities/project.json
+++ b/src/Microsoft.AspNet.WebUtilities/project.json
@@ -10,10 +10,14 @@
},
"dependencies": {
"Microsoft.Extensions.Primitives": "1.0.0-*",
- "Microsoft.Extensions.WebEncoders.Core": "1.0.0-*"
+ "System.Text.Encodings.Web": "4.0.0-beta-*"
},
"frameworks": {
- "net451": {},
+ "net451": {
+ "frameworkAssemblies": {
+ "System.Runtime": ""
+ }
+ },
"dotnet5.4": {
"dependencies": {
"System.Collections": "4.0.11-beta-*",
diff --git a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs
index 9d098518b8..302692338b 100644
--- a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs
+++ b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs
@@ -5,6 +5,7 @@ using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
+using System.Text.Encodings.Web;
using Microsoft.AspNet.Html.Abstractions;
using Microsoft.Extensions.WebEncoders;
@@ -64,7 +65,7 @@ namespace Microsoft.Extensions.Internal
}
///
- public void WriteTo(TextWriter writer, IHtmlEncoder encoder)
+ public void WriteTo(TextWriter writer, HtmlEncoder encoder)
{
if (writer == null)
{
@@ -86,7 +87,7 @@ namespace Microsoft.Extensions.Internal
var entryAsString = entry as string;
if (entryAsString != null)
{
- encoder.HtmlEncode(entryAsString, writer);
+ encoder.Encode(writer, entryAsString);
}
else
{
@@ -116,7 +117,7 @@ namespace Microsoft.Extensions.Internal
_value = value;
}
- public void WriteTo(TextWriter writer, IHtmlEncoder encoder)
+ public void WriteTo(TextWriter writer, HtmlEncoder encoder)
{
writer.Write(_value);
}
diff --git a/src/Microsoft.Extensions.WebEncoders.Core/AllowedCharsBitmap.cs b/src/Microsoft.Extensions.WebEncoders.Core/AllowedCharsBitmap.cs
deleted file mode 100644
index aae7b3c8b8..0000000000
--- a/src/Microsoft.Extensions.WebEncoders.Core/AllowedCharsBitmap.cs
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-using System.Diagnostics;
-
-namespace Microsoft.Extensions.WebEncoders
-{
- internal struct AllowedCharsBitmap
- {
- private const int ALLOWED_CHARS_BITMAP_LENGTH = 0x10000 / (8 * sizeof(uint));
- private readonly uint[] _allowedCharsBitmap;
-
- private AllowedCharsBitmap(uint[] allowedCharsBitmap)
- {
- Debug.Assert(allowedCharsBitmap != null);
- _allowedCharsBitmap = allowedCharsBitmap;
- }
-
- // Marks a character as allowed (can be returned unencoded)
- public void AllowCharacter(char c)
- {
- uint codePoint = (uint)c;
- int index = (int)(codePoint >> 5);
- int offset = (int)(codePoint & 0x1FU);
- _allowedCharsBitmap[index] |= 0x1U << offset;
- }
-
- // Marks all characters as forbidden (must be returned encoded)
- public void Clear()
- {
- Array.Clear(_allowedCharsBitmap, 0, _allowedCharsBitmap.Length);
- }
-
- // Creates a deep copy of this bitmap
- public AllowedCharsBitmap Clone()
- {
- return new AllowedCharsBitmap((uint[])_allowedCharsBitmap.Clone());
- }
-
- // should be called in place of the ctor
- public static AllowedCharsBitmap CreateNew()
- {
- return new AllowedCharsBitmap(new uint[ALLOWED_CHARS_BITMAP_LENGTH]);
- }
-
- // Marks a character as forbidden (must be returned encoded)
- public void ForbidCharacter(char c)
- {
- uint codePoint = (uint)c;
- int index = (int)(codePoint >> 5);
- int offset = (int)(codePoint & 0x1FU);
- _allowedCharsBitmap[index] &= ~(0x1U << offset);
- }
-
- public void ForbidUndefinedCharacters()
- {
- // Forbid codepoints which aren't mapped to characters or which are otherwise always disallowed
- // (includes categories Cc, Cs, Co, Cn, Zs [except U+0020 SPACE], Zl, Zp)
- uint[] definedCharactersBitmap = UnicodeHelpers.GetDefinedCharacterBitmap();
- Debug.Assert(definedCharactersBitmap.Length == _allowedCharsBitmap.Length);
- for (int i = 0; i < _allowedCharsBitmap.Length; i++)
- {
- _allowedCharsBitmap[i] &= definedCharactersBitmap[i];
- }
- }
-
- // Determines whether the given character can be returned unencoded.
- public bool IsCharacterAllowed(char c)
- {
- uint codePoint = (uint)c;
- int index = (int)(codePoint >> 5);
- int offset = (int)(codePoint & 0x1FU);
- return ((_allowedCharsBitmap[index] >> offset) & 0x1U) != 0;
- }
- }
-}
diff --git a/src/Microsoft.Extensions.WebEncoders.Core/CodePointFilter.cs b/src/Microsoft.Extensions.WebEncoders.Core/CodePointFilter.cs
deleted file mode 100644
index dda6499604..0000000000
--- a/src/Microsoft.Extensions.WebEncoders.Core/CodePointFilter.cs
+++ /dev/null
@@ -1,312 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-using System.Collections.Generic;
-
-namespace Microsoft.Extensions.WebEncoders
-{
- ///
- /// Represents a filter which allows only certain Unicode code points through.
- ///
- public sealed class CodePointFilter : ICodePointFilter
- {
- private AllowedCharsBitmap _allowedCharsBitmap;
-
- ///
- /// Instantiates an empty filter (allows no code points through by default).
- ///
- public CodePointFilter()
- {
- _allowedCharsBitmap = AllowedCharsBitmap.CreateNew();
- }
-
- ///
- /// Instantiates the filter by cloning the allow list of another .
- ///
- public CodePointFilter(ICodePointFilter other)
- {
- if (other == null)
- {
- throw new ArgumentNullException(nameof(other));
- }
-
- CodePointFilter otherAsCodePointFilter = other as CodePointFilter;
- if (otherAsCodePointFilter != null)
- {
- _allowedCharsBitmap = otherAsCodePointFilter.GetAllowedCharsBitmap();
- }
- else
- {
- _allowedCharsBitmap = AllowedCharsBitmap.CreateNew();
- AllowFilter(other);
- }
- }
-
- ///
- /// Instantiates the filter where only the character ranges specified by
- /// are allowed by the filter.
- ///
- public CodePointFilter(params UnicodeRange[] allowedRanges)
- {
- _allowedCharsBitmap = AllowedCharsBitmap.CreateNew();
- AllowRanges(allowedRanges);
- }
-
- ///
- /// Allows the character specified by through the filter.
- ///
- ///
- /// The 'this' instance.
- ///
- public CodePointFilter AllowChar(char c)
- {
- _allowedCharsBitmap.AllowCharacter(c);
- return this;
- }
-
- ///
- /// Allows all characters specified by through the filter.
- ///
- ///
- /// The 'this' instance.
- ///
- public CodePointFilter AllowChars(params char[] chars)
- {
- if (chars != null)
- {
- for (int i = 0; i < chars.Length; i++)
- {
- _allowedCharsBitmap.AllowCharacter(chars[i]);
- }
- }
- return this;
- }
-
- ///
- /// Allows all characters in the string through the filter.
- ///
- ///
- /// The 'this' instance.
- ///
- public CodePointFilter AllowChars(string chars)
- {
- if (chars == null)
- {
- throw new ArgumentNullException(nameof(chars));
- }
-
- for (int i = 0; i < chars.Length; i++)
- {
- _allowedCharsBitmap.AllowCharacter(chars[i]);
- }
- return this;
- }
-
- ///
- /// Allows all characters specified by through the filter.
- ///
- ///
- /// The 'this' instance.
- ///
- public CodePointFilter AllowFilter(ICodePointFilter filter)
- {
- if (filter == null)
- {
- throw new ArgumentNullException(nameof(filter));
- }
-
- foreach (var allowedCodePoint in filter.GetAllowedCodePoints())
- {
- // If the code point can't be represented as a BMP character, skip it.
- char codePointAsChar = (char)allowedCodePoint;
- if (allowedCodePoint == codePointAsChar)
- {
- _allowedCharsBitmap.AllowCharacter(codePointAsChar);
- }
- }
- return this;
- }
-
- ///
- /// Allows all characters specified by through the filter.
- ///
- ///
- /// The 'this' instance.
- ///
- public CodePointFilter AllowRange(UnicodeRange range)
- {
- if (range == null)
- {
- throw new ArgumentNullException(nameof(range));
- }
-
- int firstCodePoint = range.FirstCodePoint;
- int rangeSize = range.RangeSize;
- for (int i = 0; i < rangeSize; i++)
- {
- _allowedCharsBitmap.AllowCharacter((char)(firstCodePoint + i));
- }
- return this;
- }
-
- ///
- /// Allows all characters specified by through the filter.
- ///
- ///
- /// The 'this' instance.
- ///
- public CodePointFilter AllowRanges(params UnicodeRange[] ranges)
- {
- if (ranges != null)
- {
- for (int i = 0; i < ranges.Length; i++)
- {
- AllowRange(ranges[i]);
- }
- }
- return this;
- }
-
- ///
- /// Resets this filter by disallowing all characters.
- ///
- ///
- /// The 'this' instance.
- ///
- public CodePointFilter Clear()
- {
- _allowedCharsBitmap.Clear();
- return this;
- }
-
- ///
- /// Disallows the character through the filter.
- ///
- ///
- /// The 'this' instance.
- ///
- public CodePointFilter ForbidChar(char c)
- {
- _allowedCharsBitmap.ForbidCharacter(c);
- return this;
- }
-
- ///
- /// Disallows all characters specified by through the filter.
- ///
- ///
- /// The 'this' instance.
- ///
- public CodePointFilter ForbidChars(params char[] chars)
- {
- if (chars != null)
- {
- for (int i = 0; i < chars.Length; i++)
- {
- _allowedCharsBitmap.ForbidCharacter(chars[i]);
- }
- }
- return this;
- }
-
- ///
- /// Disallows all characters in the string through the filter.
- ///
- ///
- /// The 'this' instance.
- ///
- public CodePointFilter ForbidChars(string chars)
- {
- if (chars == null)
- {
- throw new ArgumentNullException(nameof(chars));
- }
-
- for (int i = 0; i < chars.Length; i++)
- {
- _allowedCharsBitmap.ForbidCharacter(chars[i]);
- }
- return this;
- }
-
- ///
- /// Disallows all characters specified by through the filter.
- ///
- ///
- /// The 'this' instance.
- ///
- public CodePointFilter ForbidRange(UnicodeRange range)
- {
- if (range == null)
- {
- throw new ArgumentNullException(nameof(range));
- }
-
- int firstCodePoint = range.FirstCodePoint;
- int rangeSize = range.RangeSize;
- for (int i = 0; i < rangeSize; i++)
- {
- _allowedCharsBitmap.ForbidCharacter((char)(firstCodePoint + i));
- }
- return this;
- }
-
- ///
- /// Disallows all characters specified by through the filter.
- ///
- ///
- /// The 'this' instance.
- ///
- public CodePointFilter ForbidRanges(params UnicodeRange[] ranges)
- {
- if (ranges != null)
- {
- for (int i = 0; i < ranges.Length; i++)
- {
- ForbidRange(ranges[i]);
- }
- }
- return this;
- }
-
- ///
- /// Retrieves the bitmap of allowed characters from this filter.
- /// The returned bitmap is a clone of the original bitmap to avoid unintentional modification.
- ///
- internal AllowedCharsBitmap GetAllowedCharsBitmap()
- {
- return _allowedCharsBitmap.Clone();
- }
-
- ///
- /// Gets an enumeration of all allowed code points.
- ///
- public IEnumerable GetAllowedCodePoints()
- {
- for (int i = 0; i < 0x10000; i++)
- {
- if (_allowedCharsBitmap.IsCharacterAllowed((char)i))
- {
- yield return i;
- }
- }
- }
-
- ///
- /// Returns a value stating whether the character is allowed through the filter.
- ///
- public bool IsCharacterAllowed(char c)
- {
- return _allowedCharsBitmap.IsCharacterAllowed(c);
- }
-
- ///
- /// Wraps the provided filter as a CodePointFilter, avoiding the clone if possible.
- ///
- internal static CodePointFilter Wrap(ICodePointFilter filter)
- {
- return (filter as CodePointFilter) ?? new CodePointFilter(filter);
- }
- }
-}
diff --git a/src/Microsoft.Extensions.WebEncoders.Core/EncoderCommon.cs b/src/Microsoft.Extensions.WebEncoders.Core/EncoderCommon.cs
deleted file mode 100644
index 940a8590ae..0000000000
--- a/src/Microsoft.Extensions.WebEncoders.Core/EncoderCommon.cs
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-
-namespace Microsoft.Extensions.WebEncoders
-{
- internal static class EncoderCommon
- {
- // Gets the optimal capacity of the StringBuilder that will be used to build the output
- // given a specified number of input characters and the worst-case growth.
- public static int GetCapacityOfOutputStringBuilder(int numCharsToEncode, int worstCaseOutputCharsPerInputChar)
- {
- // We treat 32KB byte size (16k chars) as a soft upper boundary for the length of any StringBuilder
- // that we allocate. We'll try to avoid going above this boundary if we can avoid it so that we
- // don't allocate objects on the LOH.
- const int upperBound = 16 * 1024;
-
- // Once we have chosen an initial value for the StringBuilder size, the StringBuilder type will
- // efficiently allocate additionally blocks if necessary.
-
- if (numCharsToEncode >= upperBound)
- {
- // We know that the output will contain at least as many characters as the input, so if the
- // input length exceeds the soft upper boundary just preallocate the entire builder and hope for
- // a best-case outcome.
- return numCharsToEncode;
- }
- else
- {
- // Allocate the worst-case if we can, but don't exceed the soft upper boundary.
- long worstCaseTotalChars = (long)numCharsToEncode * worstCaseOutputCharsPerInputChar;
- return (int)Math.Min(upperBound, worstCaseTotalChars);
- }
- }
- }
-}
diff --git a/src/Microsoft.Extensions.WebEncoders.Core/EncoderExtensions.cs b/src/Microsoft.Extensions.WebEncoders.Core/EncoderExtensions.cs
deleted file mode 100644
index d6428f866e..0000000000
--- a/src/Microsoft.Extensions.WebEncoders.Core/EncoderExtensions.cs
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-using System.IO;
-
-namespace Microsoft.Extensions.WebEncoders
-{
- ///
- /// Helpful extension methods for the encoder classes.
- ///
- public static class EncoderExtensions
- {
- ///
- /// HTML-encodes a string and writes the result to the supplied output.
- ///
- ///
- /// The encoded value is also safe for inclusion inside an HTML attribute
- /// as long as the attribute value is surrounded by single or double quotes.
- ///
- public static void HtmlEncode(this IHtmlEncoder htmlEncoder, string value, TextWriter output)
- {
- if (htmlEncoder == null)
- {
- throw new ArgumentNullException(nameof(htmlEncoder));
- }
-
- if (!String.IsNullOrEmpty(value))
- {
- htmlEncoder.HtmlEncode(value, 0, value.Length, output);
- }
- }
-
- ///
- /// JavaScript-escapes a string and writes the result to the supplied output.
- ///
- public static void JavaScriptStringEncode(this IJavaScriptStringEncoder javaScriptStringEncoder, string value, TextWriter output)
- {
- if (javaScriptStringEncoder == null)
- {
- throw new ArgumentNullException(nameof(javaScriptStringEncoder));
- }
-
- if (!String.IsNullOrEmpty(value))
- {
- javaScriptStringEncoder.JavaScriptStringEncode(value, 0, value.Length, output);
- }
- }
-
- ///
- /// URL-encodes a string and writes the result to the supplied output.
- ///
- ///
- /// The encoded value is safe for use in the segment, query, or
- /// fragment portion of a URI.
- ///
- public static void UrlEncode(this IUrlEncoder urlEncoder, string value, TextWriter output)
- {
- if (urlEncoder == null)
- {
- throw new ArgumentNullException(nameof(urlEncoder));
- }
-
- if (!String.IsNullOrEmpty(value))
- {
- urlEncoder.UrlEncode(value, 0, value.Length, output);
- }
- }
- }
-}
diff --git a/src/Microsoft.Extensions.WebEncoders.Core/HexUtil.cs b/src/Microsoft.Extensions.WebEncoders.Core/HexUtil.cs
deleted file mode 100644
index 3262a1665d..0000000000
--- a/src/Microsoft.Extensions.WebEncoders.Core/HexUtil.cs
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-using System.Diagnostics;
-using System.Runtime.CompilerServices;
-
-namespace Microsoft.Extensions.WebEncoders
-{
- ///
- /// Contains helpers for dealing with byte-hex char conversions.
- ///
- internal static class HexUtil
- {
- ///
- /// Converts a number 0 - 15 to its associated hex character '0' - 'F'.
- ///
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- internal static char IntToChar(uint i)
- {
- Debug.Assert(i < 16);
- return (i < 10) ? (char)('0' + i) : (char)('A' + (i - 10));
- }
-
- ///
- /// Returns the integral form of this hexadecimal character.
- ///
- /// 0 - 15 if the character is valid, -1 if the character is invalid.
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- internal static int ParseHexCharacter(char c)
- {
- if ('0' <= c && c <= '9') { return c - '0'; }
- else if ('A' <= c && c <= 'F') { return c - 'A' + 10; }
- else if ('a' <= c && c <= 'f') { return c - 'a' + 10; }
- else { return -1; }
- }
-
- ///
- /// Gets the uppercase hex-encoded form of a byte.
- ///
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- internal static void WriteHexEncodedByte(byte b, out char firstHexChar, out char secondHexChar)
- {
- firstHexChar = IntToChar((uint)b >> 4);
- secondHexChar = IntToChar((uint)b & 0xFU);
- }
- }
-}
diff --git a/src/Microsoft.Extensions.WebEncoders.Core/HtmlEncoder.cs b/src/Microsoft.Extensions.WebEncoders.Core/HtmlEncoder.cs
deleted file mode 100644
index d1347c0338..0000000000
--- a/src/Microsoft.Extensions.WebEncoders.Core/HtmlEncoder.cs
+++ /dev/null
@@ -1,208 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-using System.Diagnostics;
-using System.IO;
-using System.Runtime.CompilerServices;
-using System.Threading;
-
-namespace Microsoft.Extensions.WebEncoders
-{
- ///
- /// A class which can perform HTML encoding given an allow list of characters which
- /// can be represented unencoded.
- ///
- ///
- /// Instances of this type will always encode a certain set of characters (such as <
- /// and >), even if the filter provided in the constructor allows such characters.
- /// Once constructed, instances of this class are thread-safe for multiple callers.
- ///
- public unsafe sealed class HtmlEncoder : IHtmlEncoder
- {
- // The default HtmlEncoder (Basic Latin), instantiated on demand
- private static HtmlEncoder _defaultEncoder;
-
- // The inner encoder, responsible for the actual encoding routines
- private readonly HtmlUnicodeEncoder _innerUnicodeEncoder;
-
- ///
- /// Instantiates an encoder using as its allow list.
- /// Any character not in the range will be escaped.
- ///
- public HtmlEncoder()
- : this(HtmlUnicodeEncoder.BasicLatin)
- {
- }
-
- ///
- /// Instantiates an encoder specifying which Unicode character ranges are allowed to
- /// pass through the encoder unescaped. Any character not in the set of ranges specified
- /// by will be escaped.
- ///
- public HtmlEncoder(params UnicodeRange[] allowedRanges)
- : this(new HtmlUnicodeEncoder(new CodePointFilter(allowedRanges)))
- {
- }
-
- ///
- /// Instantiates an encoder using a custom code point filter. Any character not in the
- /// set returned by 's
- /// method will be escaped.
- ///
- public HtmlEncoder(ICodePointFilter filter)
- : this(new HtmlUnicodeEncoder(CodePointFilter.Wrap(filter)))
- {
- if (filter == null)
- {
- throw new ArgumentNullException(nameof(filter));
- }
- }
-
- private HtmlEncoder(HtmlUnicodeEncoder innerEncoder)
- {
- Debug.Assert(innerEncoder != null);
- _innerUnicodeEncoder = innerEncoder;
- }
-
- ///
- /// A default instance of .
- ///
- ///
- /// This normally corresponds to . However, this property is
- /// settable so that a developer can change the default implementation application-wide.
- ///
- public static HtmlEncoder Default
- {
- get
- {
- return Volatile.Read(ref _defaultEncoder) ?? CreateDefaultEncoderSlow();
- }
- set
- {
- if (value == null)
- {
- throw new ArgumentNullException(nameof(value));
- }
- Volatile.Write(ref _defaultEncoder, value);
- }
- }
-
- [MethodImpl(MethodImplOptions.NoInlining)] // the JITter can attempt to inline the caller itself without worrying about us
- private static HtmlEncoder CreateDefaultEncoderSlow()
- {
- var onDemandEncoder = new HtmlEncoder();
- return Interlocked.CompareExchange(ref _defaultEncoder, onDemandEncoder, null) ?? onDemandEncoder;
- }
-
- ///
- /// Everybody's favorite HtmlEncode routine.
- ///
- public void HtmlEncode(char[] value, int startIndex, int charCount, TextWriter output)
- {
- if (value == null)
- {
- throw new ArgumentNullException(nameof(value));
- }
-
- if (output == null)
- {
- throw new ArgumentNullException(nameof(output));
- }
-
- _innerUnicodeEncoder.Encode(value, startIndex, charCount, output);
- }
-
- ///
- /// Everybody's favorite HtmlEncode routine.
- ///
- public string HtmlEncode(string value)
- {
- return _innerUnicodeEncoder.Encode(value);
- }
-
- ///
- /// Everybody's favorite HtmlEncode routine.
- ///
- public void HtmlEncode(string value, int startIndex, int charCount, TextWriter output)
- {
- if (value == null)
- {
- throw new ArgumentNullException(nameof(value));
- }
-
- if (output == null)
- {
- throw new ArgumentNullException(nameof(output));
- }
-
- _innerUnicodeEncoder.Encode(value, startIndex, charCount, output);
- }
-
- private sealed class HtmlUnicodeEncoder : UnicodeEncoderBase
- {
- // A singleton instance of the basic latin encoder.
- private static HtmlUnicodeEncoder _basicLatinSingleton;
-
- // The worst case encoding is 8 output chars per input char: [input] U+FFFF -> [output] ""
- // We don't need to worry about astral code points since they consume *two* input chars to
- // generate at most 10 output chars (""), which equates to 5 output chars per input char.
- private const int MaxOutputCharsPerInputChar = 8;
-
- internal HtmlUnicodeEncoder(CodePointFilter filter)
- : base(filter, MaxOutputCharsPerInputChar)
- {
- }
-
- internal static HtmlUnicodeEncoder BasicLatin
- {
- get
- {
- HtmlUnicodeEncoder encoder = Volatile.Read(ref _basicLatinSingleton);
- if (encoder == null)
- {
- encoder = new HtmlUnicodeEncoder(new CodePointFilter(UnicodeRanges.BasicLatin));
- Volatile.Write(ref _basicLatinSingleton, encoder);
- }
- return encoder;
- }
- }
-
- // Writes a scalar value as an HTML-encoded entity.
- protected override void WriteEncodedScalar(ref Writer writer, uint value)
- {
- if (value == (uint)'\"') { writer.Write("""); }
- else if (value == (uint)'&') { writer.Write("&"); }
- else if (value == (uint)'<') { writer.Write("<"); }
- else if (value == (uint)'>') { writer.Write(">"); }
- else { WriteEncodedScalarAsNumericEntity(ref writer, value); }
- }
-
- // Writes a scalar value as an HTML-encoded numeric entity.
- private static void WriteEncodedScalarAsNumericEntity(ref Writer writer, uint value)
- {
- // We're building the characters up in reverse
- char* chars = stackalloc char[8 /* "FFFFFFFF" */];
- int numCharsWritten = 0;
- do
- {
- Debug.Assert(numCharsWritten < 8, "Couldn't have written 8 characters out by this point.");
- // Pop off the last nibble
- chars[numCharsWritten++] = HexUtil.IntToChar(value & 0xFU);
- value >>= 4;
- } while (value != 0);
-
- // Finally, write out the HTML-encoded scalar value.
- writer.Write('&');
- writer.Write('#');
- writer.Write('x');
- Debug.Assert(numCharsWritten > 0, "At least one character should've been written.");
- do
- {
- writer.Write(chars[--numCharsWritten]);
- } while (numCharsWritten != 0);
- writer.Write(';');
- }
- }
- }
-}
diff --git a/src/Microsoft.Extensions.WebEncoders.Core/ICodePointFilter.cs b/src/Microsoft.Extensions.WebEncoders.Core/ICodePointFilter.cs
deleted file mode 100644
index 446bc354a5..0000000000
--- a/src/Microsoft.Extensions.WebEncoders.Core/ICodePointFilter.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-using System.Collections.Generic;
-
-namespace Microsoft.Extensions.WebEncoders
-{
- ///
- /// Represents a filter which allows only certain Unicode code points through.
- ///
- public interface ICodePointFilter
- {
- ///
- /// Gets an enumeration of all allowed code points.
- ///
- IEnumerable GetAllowedCodePoints();
- }
-}
diff --git a/src/Microsoft.Extensions.WebEncoders.Core/IHtmlEncoder.cs b/src/Microsoft.Extensions.WebEncoders.Core/IHtmlEncoder.cs
deleted file mode 100644
index e6bbb35a5c..0000000000
--- a/src/Microsoft.Extensions.WebEncoders.Core/IHtmlEncoder.cs
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System.IO;
-
-namespace Microsoft.Extensions.WebEncoders
-{
- ///
- /// Provides services for HTML-encoding input.
- ///
- public interface IHtmlEncoder
- {
- ///
- /// HTML-encodes a character array and writes the result to the supplied
- /// output.
- ///
- ///
- /// The encoded value is also appropriately encoded for inclusion inside an HTML attribute
- /// as long as the attribute value is surrounded by single or double quotes.
- ///
- void HtmlEncode(char[] value, int startIndex, int charCount, TextWriter output);
-
- ///
- /// HTML-encodes a given input string.
- ///
- ///
- /// The HTML-encoded value, or null if the input string was null.
- ///
- ///
- /// The return value is also appropriately encoded for inclusion inside an HTML attribute
- /// as long as the attribute value is surrounded by single or double quotes.
- ///
- string HtmlEncode(string value);
-
- ///
- /// HTML-encodes a given input string and writes the result to the
- /// supplied output.
- ///
- ///
- /// The encoded value is also appropriately encoded for inclusion inside an HTML attribute
- /// as long as the attribute value is surrounded by single or double quotes.
- ///
- void HtmlEncode(string value, int startIndex, int charCount, TextWriter output);
- }
-}
diff --git a/src/Microsoft.Extensions.WebEncoders.Core/IJavaScriptStringEncoder.cs b/src/Microsoft.Extensions.WebEncoders.Core/IJavaScriptStringEncoder.cs
deleted file mode 100644
index 29d07a46cc..0000000000
--- a/src/Microsoft.Extensions.WebEncoders.Core/IJavaScriptStringEncoder.cs
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System.IO;
-
-namespace Microsoft.Extensions.WebEncoders
-{
- ///
- /// Provides services for JavaScript-escaping strings.
- ///
- public interface IJavaScriptStringEncoder
- {
- ///
- /// JavaScript-escapes a character array and writes the result to the
- /// supplied output.
- ///
- ///
- /// The encoded value is appropriately encoded for inclusion inside a quoted JSON string.
- ///
- void JavaScriptStringEncode(char[] value, int startIndex, int charCount, TextWriter output);
-
- ///
- /// JavaScript-escapes a given input string.
- ///
- ///
- /// The JavaScript-escaped value, or null if the input string was null.
- /// The encoded value is appropriately encoded for inclusion inside a quoted JSON string.
- ///
- string JavaScriptStringEncode(string value);
-
- ///
- /// JavaScript-escapes a given input string and writes the
- /// result to the supplied output.
- ///
- ///
- /// The encoded value is appropriately encoded for inclusion inside a quoted JSON string.
- ///
- void JavaScriptStringEncode(string value, int startIndex, int charCount, TextWriter output);
- }
-}
diff --git a/src/Microsoft.Extensions.WebEncoders.Core/IUrlEncoder.cs b/src/Microsoft.Extensions.WebEncoders.Core/IUrlEncoder.cs
deleted file mode 100644
index c3e92568ab..0000000000
--- a/src/Microsoft.Extensions.WebEncoders.Core/IUrlEncoder.cs
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System.IO;
-
-namespace Microsoft.Extensions.WebEncoders
-{
- ///
- /// Provides services for URL-escaping strings.
- ///
- public interface IUrlEncoder
- {
- ///
- /// URL-escapes a character array and writes the result to the supplied
- /// output.
- ///
- ///
- /// The encoded value is appropriately encoded for inclusion in the segment, query, or
- /// fragment portion of a URI.
- ///
- void UrlEncode(char[] value, int startIndex, int charCount, TextWriter output);
-
- ///
- /// URL-escapes a given input string.
- ///
- ///
- /// The URL-escaped value, or null if the input string was null.
- ///
- ///
- /// The return value is appropriately encoded for inclusion in the segment, query, or
- /// fragment portion of a URI.
- ///
- string UrlEncode(string value);
-
- ///
- /// URL-escapes a string and writes the result to the supplied output.
- ///
- ///
- /// The encoded value is appropriately encoded for inclusion in the segment, query, or
- /// fragment portion of a URI.
- ///
- void UrlEncode(string value, int startIndex, int charCount, TextWriter output);
- }
-}
diff --git a/src/Microsoft.Extensions.WebEncoders.Core/JavaScriptStringEncoder.cs b/src/Microsoft.Extensions.WebEncoders.Core/JavaScriptStringEncoder.cs
deleted file mode 100644
index 008c6bcc51..0000000000
--- a/src/Microsoft.Extensions.WebEncoders.Core/JavaScriptStringEncoder.cs
+++ /dev/null
@@ -1,231 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-using System.Diagnostics;
-using System.IO;
-using System.Runtime.CompilerServices;
-using System.Threading;
-
-namespace Microsoft.Extensions.WebEncoders
-{
- ///
- /// A class which can perform JavaScript string escaping given an allow list of characters which
- /// can be represented unescaped.
- ///
- ///
- /// Instances of this type will always encode a certain set of characters (such as '
- /// and "), even if the filter provided in the constructor allows such characters.
- /// Once constructed, instances of this class are thread-safe for multiple callers.
- ///
- public sealed class JavaScriptStringEncoder : IJavaScriptStringEncoder
- {
- // The default JavaScript string encoder (Basic Latin), instantiated on demand
- private static JavaScriptStringEncoder _defaultEncoder;
-
- // The inner encoder, responsible for the actual encoding routines
- private readonly JavaScriptStringUnicodeEncoder _innerUnicodeEncoder;
-
- ///
- /// Instantiates an encoder using as its allow list.
- /// Any character not in the range will be escaped.
- ///
- public JavaScriptStringEncoder()
- : this(JavaScriptStringUnicodeEncoder.BasicLatin)
- {
- }
-
- ///
- /// Instantiates an encoder specifying which Unicode character ranges are allowed to
- /// pass through the encoder unescaped. Any character not in the set of ranges specified
- /// by will be escaped.
- ///
- public JavaScriptStringEncoder(params UnicodeRange[] allowedRanges)
- : this(new JavaScriptStringUnicodeEncoder(new CodePointFilter(allowedRanges)))
- {
- }
-
- ///
- /// Instantiates an encoder using a custom code point filter. Any character not in the
- /// set returned by 's
- /// method will be escaped.
- ///
- public JavaScriptStringEncoder(ICodePointFilter filter)
- : this(new JavaScriptStringUnicodeEncoder(CodePointFilter.Wrap(filter)))
- {
- if (filter == null)
- {
- throw new ArgumentNullException(nameof(filter));
- }
- }
-
- private JavaScriptStringEncoder(JavaScriptStringUnicodeEncoder innerEncoder)
- {
- Debug.Assert(innerEncoder != null);
- _innerUnicodeEncoder = innerEncoder;
- }
-
- ///
- /// A default instance of .
- ///
- ///
- /// This normally corresponds to . However, this property is
- /// settable so that a developer can change the default implementation application-wide.
- ///
- public static JavaScriptStringEncoder Default
- {
- get
- {
- return Volatile.Read(ref _defaultEncoder) ?? CreateDefaultEncoderSlow();
- }
- set
- {
- if (value == null)
- {
- throw new ArgumentNullException(nameof(value));
- }
- Volatile.Write(ref _defaultEncoder, value);
- }
- }
-
- [MethodImpl(MethodImplOptions.NoInlining)] // the JITter can attempt to inline the caller itself without worrying about us
- private static JavaScriptStringEncoder CreateDefaultEncoderSlow()
- {
- var onDemandEncoder = new JavaScriptStringEncoder();
- return Interlocked.CompareExchange(ref _defaultEncoder, onDemandEncoder, null) ?? onDemandEncoder;
- }
-
- ///
- /// Everybody's favorite JavaScriptStringEncode routine.
- ///
- public void JavaScriptStringEncode(char[] value, int startIndex, int charCount, TextWriter output)
- {
- if (value == null)
- {
- throw new ArgumentNullException(nameof(value));
- }
-
- if (output == null)
- {
- throw new ArgumentNullException(nameof(output));
- }
-
- _innerUnicodeEncoder.Encode(value, startIndex, charCount, output);
- }
-
- ///
- /// Everybody's favorite JavaScriptStringEncode routine.
- ///
- public string JavaScriptStringEncode(string value)
- {
- return _innerUnicodeEncoder.Encode(value);
- }
-
- ///
- /// Everybody's favorite JavaScriptStringEncode routine.
- ///
- public void JavaScriptStringEncode(string value, int startIndex, int charCount, TextWriter output)
- {
- if (value == null)
- {
- throw new ArgumentNullException(nameof(value));
- }
-
- if (output == null)
- {
- throw new ArgumentNullException(nameof(output));
- }
-
- _innerUnicodeEncoder.Encode(value, startIndex, charCount, output);
- }
-
- private sealed class JavaScriptStringUnicodeEncoder : UnicodeEncoderBase
- {
- // A singleton instance of the basic latin encoder.
- private static JavaScriptStringUnicodeEncoder _basicLatinSingleton;
-
- // The worst case encoding is 6 output chars per input char: [input] U+FFFF -> [output] "\uFFFF"
- // We don't need to worry about astral code points since they're represented as encoded
- // surrogate pairs in the output.
- private const int MaxOutputCharsPerInputChar = 6;
-
- internal JavaScriptStringUnicodeEncoder(CodePointFilter filter)
- : base(filter, MaxOutputCharsPerInputChar)
- {
- // The only interesting characters above and beyond what the base encoder
- // already covers are the solidus and reverse solidus.
- ForbidCharacter('\\');
- ForbidCharacter('/');
- }
-
- internal static JavaScriptStringUnicodeEncoder BasicLatin
- {
- get
- {
- JavaScriptStringUnicodeEncoder encoder = Volatile.Read(ref _basicLatinSingleton);
- if (encoder == null)
- {
- encoder = new JavaScriptStringUnicodeEncoder(new CodePointFilter(UnicodeRanges.BasicLatin));
- Volatile.Write(ref _basicLatinSingleton, encoder);
- }
- return encoder;
- }
- }
-
- // Writes a scalar value as a JavaScript-escaped character (or sequence of characters).
- // See ECMA-262, Sec. 7.8.4, and ECMA-404, Sec. 9
- // http://www.ecma-international.org/ecma-262/5.1/#sec-7.8.4
- // http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf
- protected override void WriteEncodedScalar(ref Writer writer, uint value)
- {
- // ECMA-262 allows encoding U+000B as "\v", but ECMA-404 does not.
- // Both ECMA-262 and ECMA-404 allow encoding U+002F SOLIDUS as "\/".
- // (In ECMA-262 this character is a NonEscape character.)
- // HTML-specific characters (including apostrophe and quotes) will
- // be written out as numeric entities for defense-in-depth.
- // See UnicodeEncoderBase ctor comments for more info.
-
- if (value == (uint)'\b') { writer.Write(@"\b"); }
- else if (value == (uint)'\t') { writer.Write(@"\t"); }
- else if (value == (uint)'\n') { writer.Write(@"\n"); }
- else if (value == (uint)'\f') { writer.Write(@"\f"); }
- else if (value == (uint)'\r') { writer.Write(@"\r"); }
- else if (value == (uint)'/') { writer.Write(@"\/"); }
- else if (value == (uint)'\\') { writer.Write(@"\\"); }
- else { WriteEncodedScalarAsNumericEntity(ref writer, value); }
- }
-
- // Writes a scalar value as an JavaScript-escaped character (or sequence of characters).
- private static void WriteEncodedScalarAsNumericEntity(ref Writer writer, uint value)
- {
- if (UnicodeHelpers.IsSupplementaryCodePoint((int)value))
- {
- // Convert this back to UTF-16 and write out both characters.
- char leadingSurrogate, trailingSurrogate;
- UnicodeHelpers.GetUtf16SurrogatePairFromAstralScalarValue((int)value, out leadingSurrogate, out trailingSurrogate);
- WriteEncodedSingleCharacter(ref writer, leadingSurrogate);
- WriteEncodedSingleCharacter(ref writer, trailingSurrogate);
- }
- else
- {
- // This is only a single character.
- WriteEncodedSingleCharacter(ref writer, value);
- }
- }
-
- // Writes an encoded scalar value (in the BMP) as a JavaScript-escaped character.
- private static void WriteEncodedSingleCharacter(ref Writer writer, uint value)
- {
- Debug.Assert(!UnicodeHelpers.IsSupplementaryCodePoint((int)value), "The incoming value should've been in the BMP.");
-
- // Encode this as 6 chars "\uFFFF".
- writer.Write('\\');
- writer.Write('u');
- writer.Write(HexUtil.IntToChar(value >> 12));
- writer.Write(HexUtil.IntToChar((value >> 8) & 0xFU));
- writer.Write(HexUtil.IntToChar((value >> 4) & 0xFU));
- writer.Write(HexUtil.IntToChar(value & 0xFU));
- }
- }
- }
-}
diff --git a/src/Microsoft.Extensions.WebEncoders.Core/Microsoft.Extensions.WebEncoders.Core.xproj b/src/Microsoft.Extensions.WebEncoders.Core/Microsoft.Extensions.WebEncoders.Core.xproj
deleted file mode 100644
index 559ec64868..0000000000
--- a/src/Microsoft.Extensions.WebEncoders.Core/Microsoft.Extensions.WebEncoders.Core.xproj
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
- 14.0
- $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)
-
-
-
- be9112cb-d87d-4080-9cc3-24492d49cbe6
- ..\..\artifacts\obj\$(MSBuildProjectName)
- ..\..\artifacts\bin\$(MSBuildProjectName)\
-
-
- 2.0
-
-
-
\ No newline at end of file
diff --git a/src/Microsoft.Extensions.WebEncoders.Core/Properties/AssemblyInfo.cs b/src/Microsoft.Extensions.WebEncoders.Core/Properties/AssemblyInfo.cs
deleted file mode 100644
index b781d6ca97..0000000000
--- a/src/Microsoft.Extensions.WebEncoders.Core/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System.Reflection;
-using System.Resources;
-using System.Runtime.CompilerServices;
-
-[assembly: InternalsVisibleTo("Microsoft.Extensions.WebEncoders.Tests")]
-[assembly: AssemblyMetadata("Serviceable", "True")]
-[assembly: NeutralResourcesLanguage("en-us")]
\ No newline at end of file
diff --git a/src/Microsoft.Extensions.WebEncoders.Core/UnicodeEncoderBase.cs b/src/Microsoft.Extensions.WebEncoders.Core/UnicodeEncoderBase.cs
deleted file mode 100644
index 1a6baaf665..0000000000
--- a/src/Microsoft.Extensions.WebEncoders.Core/UnicodeEncoderBase.cs
+++ /dev/null
@@ -1,301 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-using System.Diagnostics;
-using System.IO;
-using System.Runtime.CompilerServices;
-using System.Text;
-
-namespace Microsoft.Extensions.WebEncoders
-{
- internal unsafe abstract class UnicodeEncoderBase
- {
- // A bitmap of characters which are allowed to be returned unescaped.
- private AllowedCharsBitmap _allowedCharsBitmap;
-
- // The worst-case number of output chars generated for any input char.
- private readonly int _maxOutputCharsPerInputChar;
-
- ///
- /// Instantiates an encoder using a custom allow list of characters.
- ///
- protected UnicodeEncoderBase(CodePointFilter filter, int maxOutputCharsPerInputChar)
- {
- _maxOutputCharsPerInputChar = maxOutputCharsPerInputChar;
- _allowedCharsBitmap = filter.GetAllowedCharsBitmap();
-
- // Forbid characters that are special in HTML.
- // Even though this is a common encoder used by everybody (including URL
- // and JavaScript strings), it's unfortunately common for developers to
- // forget to HTML-encode a string once it has been URL-encoded or
- // JavaScript string-escaped, so this offers extra protection.
- ForbidCharacter('<');
- ForbidCharacter('>');
- ForbidCharacter('&');
- ForbidCharacter('\''); // can be used to escape attributes
- ForbidCharacter('\"'); // can be used to escape attributes
- ForbidCharacter('+'); // technically not HTML-specific, but can be used to perform UTF7-based attacks
-
- // Forbid codepoints which aren't mapped to characters or which are otherwise always disallowed
- // (includes categories Cc, Cs, Co, Cn, Zs [except U+0020 SPACE], Zl, Zp)
- _allowedCharsBitmap.ForbidUndefinedCharacters();
- }
-
- // Marks a character as forbidden (must be returned encoded)
- protected void ForbidCharacter(char c)
- {
- _allowedCharsBitmap.ForbidCharacter(c);
- }
-
- ///
- /// Entry point to the encoder.
- ///
- public void Encode(char[] value, int startIndex, int charCount, TextWriter output)
- {
- // Input checking
- if (value == null)
- {
- throw new ArgumentNullException(nameof(value));
- }
- if (output == null)
- {
- throw new ArgumentNullException(nameof(output));
- }
- ValidateInputs(startIndex, charCount, actualInputLength: value.Length);
-
- if (charCount != 0)
- {
- fixed (char* pChars = value)
- {
- int indexOfFirstCharWhichRequiresEncoding = GetIndexOfFirstCharWhichRequiresEncoding(&pChars[startIndex], charCount);
- if (indexOfFirstCharWhichRequiresEncoding < 0)
- {
- // All chars are valid - just copy the buffer as-is.
- output.Write(value, startIndex, charCount);
- }
- else
- {
- // Flush all chars which are known to be valid, then encode the remainder individually
- if (indexOfFirstCharWhichRequiresEncoding > 0)
- {
- output.Write(value, startIndex, indexOfFirstCharWhichRequiresEncoding);
- }
- EncodeCore(&pChars[startIndex + indexOfFirstCharWhichRequiresEncoding], (uint)(charCount - indexOfFirstCharWhichRequiresEncoding), output);
- }
- }
- }
- }
-
- ///
- /// Entry point to the encoder.
- ///
- public string Encode(string value)
- {
- if (String.IsNullOrEmpty(value))
- {
- return value;
- }
-
- // Quick check: does the string need to be encoded at all?
- // If not, just return the input string as-is.
- for (int i = 0; i < value.Length; i++)
- {
- if (!IsCharacterAllowed(value[i]))
- {
- return EncodeCore(value, idxOfFirstCharWhichRequiresEncoding: i);
- }
- }
- return value;
- }
-
- ///
- /// Entry point to the encoder.
- ///
- public void Encode(string value, int startIndex, int charCount, TextWriter output)
- {
- // Input checking
- if (value == null)
- {
- throw new ArgumentNullException(nameof(value));
- }
- if (output == null)
- {
- throw new ArgumentNullException(nameof(output));
- }
- ValidateInputs(startIndex, charCount, actualInputLength: value.Length);
-
- if (charCount != 0)
- {
- fixed (char* pChars = value)
- {
- if (charCount == value.Length)
- {
- // Optimize for the common case: we're being asked to encode the entire input string
- // (not just a subset). If all characters are safe, we can just spit it out as-is.
- int indexOfFirstCharWhichRequiresEncoding = GetIndexOfFirstCharWhichRequiresEncoding(pChars, charCount);
- if (indexOfFirstCharWhichRequiresEncoding < 0)
- {
- output.Write(value);
- }
- else
- {
- // Flush all chars which are known to be valid, then encode the remainder individually
- for (int i = 0; i < indexOfFirstCharWhichRequiresEncoding; i++)
- {
- output.Write(pChars[i]);
- }
- EncodeCore(&pChars[indexOfFirstCharWhichRequiresEncoding], (uint)(charCount - indexOfFirstCharWhichRequiresEncoding), output);
- }
- }
- else
- {
- // We're being asked to encode a subset, so we need to go through the slow path of appending
- // each character individually.
- EncodeCore(&pChars[startIndex], (uint)charCount, output);
- }
- }
- }
- }
-
- private string EncodeCore(string input, int idxOfFirstCharWhichRequiresEncoding)
- {
- Debug.Assert(idxOfFirstCharWhichRequiresEncoding >= 0);
- Debug.Assert(idxOfFirstCharWhichRequiresEncoding < input.Length);
-
- int numCharsWhichMayRequireEncoding = input.Length - idxOfFirstCharWhichRequiresEncoding;
- int sbCapacity = checked(idxOfFirstCharWhichRequiresEncoding + EncoderCommon.GetCapacityOfOutputStringBuilder(numCharsWhichMayRequireEncoding, _maxOutputCharsPerInputChar));
- Debug.Assert(sbCapacity >= input.Length);
-
- // Allocate the StringBuilder with the first (known to not require encoding) part of the input string,
- // then begin encoding from the last (potentially requiring encoding) part of the input string.
- StringBuilder builder = new StringBuilder(input, 0, idxOfFirstCharWhichRequiresEncoding, sbCapacity);
- Writer writer = new Writer(builder);
- fixed (char* pInput = input)
- {
- EncodeCore(ref writer, &pInput[idxOfFirstCharWhichRequiresEncoding], (uint)numCharsWhichMayRequireEncoding);
- }
- return builder.ToString();
- }
-
- private void EncodeCore(char* input, uint charsRemaining, TextWriter output)
- {
- Writer writer = new Writer(output);
- EncodeCore(ref writer, input, charsRemaining);
- }
-
- private void EncodeCore(ref Writer writer, char* input, uint charsRemaining)
- {
- while (charsRemaining != 0)
- {
- int nextScalar = UnicodeHelpers.GetScalarValueFromUtf16(input, endOfString: (charsRemaining == 1));
- if (UnicodeHelpers.IsSupplementaryCodePoint(nextScalar))
- {
- // Supplementary characters should always be encoded numerically.
- WriteEncodedScalar(ref writer, (uint)nextScalar);
-
- // We consume two UTF-16 characters for a single supplementary character.
- input += 2;
- charsRemaining -= 2;
- }
- else
- {
- // Otherwise, this was a BMP character.
- input++;
- charsRemaining--;
- char c = (char)nextScalar;
- if (IsCharacterAllowed(c))
- {
- writer.Write(c);
- }
- else
- {
- WriteEncodedScalar(ref writer, (uint)nextScalar);
- }
- }
- }
- }
-
- private int GetIndexOfFirstCharWhichRequiresEncoding(char* input, int inputLength)
- {
- for (int i = 0; i < inputLength; i++)
- {
- if (!IsCharacterAllowed(input[i]))
- {
- return i;
- }
- }
- return -1; // no characters require encoding
- }
-
- // Determines whether the given character can be returned unencoded.
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- private bool IsCharacterAllowed(char c)
- {
- return _allowedCharsBitmap.IsCharacterAllowed(c);
- }
-
- private static void ValidateInputs(int startIndex, int charCount, int actualInputLength)
- {
- if (startIndex < 0 || startIndex > actualInputLength)
- {
- throw new ArgumentOutOfRangeException(nameof(startIndex));
- }
- if (charCount < 0 || charCount > (actualInputLength - startIndex))
- {
- throw new ArgumentOutOfRangeException(nameof(charCount));
- }
- }
-
- protected abstract void WriteEncodedScalar(ref Writer writer, uint value);
-
- ///
- /// Provides an abstraction over both StringBuilder and TextWriter.
- /// Declared as a struct so we can allocate on the stack and pass by
- /// reference. Eliminates chatty virtual dispatches on hot paths.
- ///
- protected struct Writer
- {
- private readonly StringBuilder _innerBuilder;
- private readonly TextWriter _innerWriter;
-
- public Writer(StringBuilder innerBuilder)
- {
- _innerBuilder = innerBuilder;
- _innerWriter = null;
- }
-
- public Writer(TextWriter innerWriter)
- {
- _innerBuilder = null;
- _innerWriter = innerWriter;
- }
-
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public void Write(char value)
- {
- if (_innerBuilder != null)
- {
- _innerBuilder.Append(value);
- }
- else
- {
- _innerWriter.Write(value);
- }
- }
-
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public void Write(string value)
- {
- if (_innerBuilder != null)
- {
- _innerBuilder.Append(value);
- }
- else
- {
- _innerWriter.Write(value);
- }
- }
- }
- }
-}
diff --git a/src/Microsoft.Extensions.WebEncoders.Core/UnicodeHelpers.cs b/src/Microsoft.Extensions.WebEncoders.Core/UnicodeHelpers.cs
deleted file mode 100644
index 53e52ef573..0000000000
--- a/src/Microsoft.Extensions.WebEncoders.Core/UnicodeHelpers.cs
+++ /dev/null
@@ -1,231 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-using System.Diagnostics;
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Threading;
-
-namespace Microsoft.Extensions.WebEncoders
-{
- ///
- /// Contains helpers for dealing with Unicode code points.
- ///
- internal unsafe static class UnicodeHelpers
- {
- ///
- /// Used for invalid Unicode sequences or other unrepresentable values.
- ///
- private const char UNICODE_REPLACEMENT_CHAR = '\uFFFD';
-
- ///
- /// The last code point defined by the Unicode specification.
- ///
- internal const int UNICODE_LAST_CODEPOINT = 0x10FFFF;
-
- private static uint[] _definedCharacterBitmap;
-
- ///
- /// Helper method which creates a bitmap of all characters which are
- /// defined per version 8.0 of the Unicode specification.
- ///
- [MethodImpl(MethodImplOptions.NoInlining)]
- private static uint[] CreateDefinedCharacterBitmap()
- {
- // The stream should be exactly 8KB in size.
- var assembly = typeof(UnicodeHelpers).GetTypeInfo().Assembly;
- var resourceName = assembly.GetName().Name + ".compiler.resources.unicode-defined-chars.bin";
-
- var stream = assembly.GetManifestResourceStream(resourceName);
- if (stream.Length != 8 * 1024)
- {
- Environment.FailFast("Corrupt data detected.");
- }
-
- // Read everything in as raw bytes.
- byte[] rawData = new byte[8 * 1024];
- for (int numBytesReadTotal = 0; numBytesReadTotal < rawData.Length;)
- {
- int numBytesReadThisIteration = stream.Read(rawData, numBytesReadTotal, rawData.Length - numBytesReadTotal);
- if (numBytesReadThisIteration == 0)
- {
- Environment.FailFast("Corrupt data detected.");
- }
- numBytesReadTotal += numBytesReadThisIteration;
- }
-
- // Finally, convert the byte[] to a uint[].
- // The incoming bytes are little-endian.
- uint[] retVal = new uint[2 * 1024];
- for (int i = 0; i < retVal.Length; i++)
- {
- retVal[i] = (((uint)rawData[4 * i + 3]) << 24)
- | (((uint)rawData[4 * i + 2]) << 16)
- | (((uint)rawData[4 * i + 1]) << 8)
- | (uint)rawData[4 * i];
- }
-
- // And we're done!
- Volatile.Write(ref _definedCharacterBitmap, retVal);
- return retVal;
- }
-
- ///
- /// Returns a bitmap of all characters which are defined per version 8.0
- /// of the Unicode specification.
- ///
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- internal static uint[] GetDefinedCharacterBitmap()
- {
- return Volatile.Read(ref _definedCharacterBitmap) ?? CreateDefinedCharacterBitmap();
- }
-
- ///
- /// Given a UTF-16 character stream, reads the next scalar value from the stream.
- /// Set 'endOfString' to true if 'pChar' points to the last character in the stream.
- ///
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- internal static int GetScalarValueFromUtf16(char* pChar, bool endOfString)
- {
- // This method is marked as AggressiveInlining to handle the common case of a non-surrogate
- // character. The surrogate case is handled in the slower fallback code path.
- char thisChar = *pChar;
- return (Char.IsSurrogate(thisChar)) ? GetScalarValueFromUtf16Slow(pChar, endOfString) : thisChar;
- }
-
- private static int GetScalarValueFromUtf16Slow(char* pChar, bool endOfString)
- {
- char firstChar = pChar[0];
-
- if (!Char.IsSurrogate(firstChar))
- {
- Debug.Fail("This case should've been handled by the fast path.");
- return firstChar;
- }
- else if (Char.IsHighSurrogate(firstChar))
- {
- if (endOfString)
- {
- // unmatched surrogate - substitute
- return UNICODE_REPLACEMENT_CHAR;
- }
- else
- {
- char secondChar = pChar[1];
- if (Char.IsLowSurrogate(secondChar))
- {
- // valid surrogate pair - extract codepoint
- return GetScalarValueFromUtf16SurrogatePair(firstChar, secondChar);
- }
- else
- {
- // unmatched surrogate - substitute
- return UNICODE_REPLACEMENT_CHAR;
- }
- }
- }
- else
- {
- // unmatched surrogate - substitute
- Debug.Assert(Char.IsLowSurrogate(firstChar));
- return UNICODE_REPLACEMENT_CHAR;
- }
- }
-
- private static int GetScalarValueFromUtf16SurrogatePair(char highSurrogate, char lowSurrogate)
- {
- Debug.Assert(Char.IsHighSurrogate(highSurrogate));
- Debug.Assert(Char.IsLowSurrogate(lowSurrogate));
-
- // See http://www.unicode.org/versions/Unicode6.2.0/ch03.pdf, Table 3.5 for the
- // details of this conversion. We don't use Char.ConvertToUtf32 because its exception
- // handling shows up on the hot path, and our caller has already sanitized the inputs.
- return (lowSurrogate & 0x3ff) | (((highSurrogate & 0x3ff) + (1 << 6)) << 10);
- }
-
- internal static void GetUtf16SurrogatePairFromAstralScalarValue(int scalar, out char highSurrogate, out char lowSurrogate)
- {
- Debug.Assert(0x10000 <= scalar && scalar <= UNICODE_LAST_CODEPOINT);
-
- // See http://www.unicode.org/versions/Unicode6.2.0/ch03.pdf, Table 3.5 for the
- // details of this conversion. We don't use Char.ConvertFromUtf32 because its exception
- // handling shows up on the hot path, it allocates temporary strings (which we don't want),
- // and our caller has already sanitized the inputs.
-
- int x = scalar & 0xFFFF;
- int u = scalar >> 16;
- int w = u - 1;
- highSurrogate = (char)(0xD800 | (w << 6) | (x >> 10));
- lowSurrogate = (char)(0xDC00 | (x & 0x3FF));
- }
-
- ///
- /// Given a Unicode scalar value, returns the UTF-8 representation of the value.
- /// The return value's bytes should be popped from the LSB.
- ///
- internal static int GetUtf8RepresentationForScalarValue(uint scalar)
- {
- Debug.Assert(scalar <= UNICODE_LAST_CODEPOINT);
-
- // See http://www.unicode.org/versions/Unicode6.2.0/ch03.pdf, Table 3.6 for the
- // details of this conversion. We don't use UTF8Encoding since we're encoding
- // a scalar code point, not a UTF16 character sequence.
- if (scalar <= 0x7f)
- {
- // one byte used: scalar 00000000 0xxxxxxx -> byte sequence 0xxxxxxx
- byte firstByte = (byte)scalar;
- return firstByte;
- }
- else if (scalar <= 0x7ff)
- {
- // two bytes used: scalar 00000yyy yyxxxxxx -> byte sequence 110yyyyy 10xxxxxx
- byte firstByte = (byte)(0xc0 | (scalar >> 6));
- byte secondByteByte = (byte)(0x80 | (scalar & 0x3f));
- return ((secondByteByte << 8) | firstByte);
- }
- else if (scalar <= 0xffff)
- {
- // three bytes used: scalar zzzzyyyy yyxxxxxx -> byte sequence 1110zzzz 10yyyyyy 10xxxxxx
- byte firstByte = (byte)(0xe0 | (scalar >> 12));
- byte secondByte = (byte)(0x80 | ((scalar >> 6) & 0x3f));
- byte thirdByte = (byte)(0x80 | (scalar & 0x3f));
- return ((((thirdByte << 8) | secondByte) << 8) | firstByte);
- }
- else
- {
- // four bytes used: scalar 000uuuuu zzzzyyyy yyxxxxxx -> byte sequence 11110uuu 10uuzzzz 10yyyyyy 10xxxxxx
- byte firstByte = (byte)(0xf0 | (scalar >> 18));
- byte secondByte = (byte)(0x80 | ((scalar >> 12) & 0x3f));
- byte thirdByte = (byte)(0x80 | ((scalar >> 6) & 0x3f));
- byte fourthByte = (byte)(0x80 | (scalar & 0x3f));
- return ((((((fourthByte << 8) | thirdByte) << 8) | secondByte) << 8) | firstByte);
- }
- }
-
- ///
- /// Returns a value stating whether a character is defined per version 8.0
- /// of the Unicode specification. Certain classes of characters (control chars,
- /// private use, surrogates, some whitespace) are considered "undefined" for
- /// our purposes.
- ///
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- internal static bool IsCharacterDefined(char c)
- {
- uint codePoint = (uint)c;
- int index = (int)(codePoint >> 5);
- int offset = (int)(codePoint & 0x1FU);
- return ((GetDefinedCharacterBitmap()[index] >> offset) & 0x1U) != 0;
- }
-
- ///
- /// Determines whether the given scalar value is in the supplementary plane and thus
- /// requires 2 characters to be represented in UTF-16 (as a surrogate pair).
- ///
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- internal static bool IsSupplementaryCodePoint(int scalar)
- {
- return ((scalar & ~((int)Char.MaxValue)) != 0);
- }
- }
-}
diff --git a/src/Microsoft.Extensions.WebEncoders.Core/UnicodeRange.cs b/src/Microsoft.Extensions.WebEncoders.Core/UnicodeRange.cs
deleted file mode 100644
index 8320350e16..0000000000
--- a/src/Microsoft.Extensions.WebEncoders.Core/UnicodeRange.cs
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-
-namespace Microsoft.Extensions.WebEncoders
-{
- ///
- /// Represents a contiguous range of Unicode code points.
- ///
- ///
- /// Currently only the Basic Multilingual Plane is supported.
- ///
- public sealed class UnicodeRange
- {
- ///
- /// Creates a new .
- ///
- /// The first code point in the range.
- /// The number of code points in the range.
- public UnicodeRange(int firstCodePoint, int rangeSize)
- {
- // Parameter checking: the first code point and last code point must
- // lie within the BMP. See http://unicode.org/faq/blocks_ranges.html for more info.
- if (firstCodePoint < 0 || firstCodePoint > 0xFFFF)
- {
- throw new ArgumentOutOfRangeException(nameof(firstCodePoint));
- }
- if (rangeSize < 0 || ((long)firstCodePoint + (long)rangeSize > 0x10000))
- {
- throw new ArgumentOutOfRangeException(nameof(rangeSize));
- }
-
- FirstCodePoint = firstCodePoint;
- RangeSize = rangeSize;
- }
-
- ///
- /// The first code point in this range.
- ///
- public int FirstCodePoint { get; }
-
- ///
- /// The number of code points in this range.
- ///
- public int RangeSize { get; }
-
- ///
- /// Creates a new from a span of characters.
- ///
- /// The first character in the range.
- /// The last character in the range.
- /// The representing this span.
- public static UnicodeRange FromSpan(char firstChar, char lastChar)
- {
- if (lastChar < firstChar)
- {
- throw new ArgumentOutOfRangeException(nameof(lastChar));
- }
-
- return new UnicodeRange(firstChar, 1 + (int)(lastChar - firstChar));
- }
- }
-}
diff --git a/src/Microsoft.Extensions.WebEncoders.Core/UnicodeRanges.cs b/src/Microsoft.Extensions.WebEncoders.Core/UnicodeRanges.cs
deleted file mode 100644
index 73d155e141..0000000000
--- a/src/Microsoft.Extensions.WebEncoders.Core/UnicodeRanges.cs
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-using System.Diagnostics;
-using System.Runtime.CompilerServices;
-using System.Threading;
-
-namespace Microsoft.Extensions.WebEncoders
-{
- ///
- /// Contains predefined instances which correspond to blocks
- /// from the Unicode 8.0 specification.
- ///
- public static partial class UnicodeRanges
- {
- ///
- /// An empty . This range contains no code points.
- ///
- public static UnicodeRange None => Volatile.Read(ref _none) ?? CreateEmptyRange(ref _none);
- private static UnicodeRange _none;
-
- ///
- /// A which contains all characters in the Unicode Basic
- /// Multilingual Plane (U+0000..U+FFFF).
- ///
- public static UnicodeRange All => Volatile.Read(ref _all) ?? CreateRange(ref _all, '\u0000', '\uFFFF');
- private static UnicodeRange _all;
-
- [MethodImpl(MethodImplOptions.NoInlining)] // the caller should be inlined, not this method
- private static UnicodeRange CreateEmptyRange(ref UnicodeRange range)
- {
- // If the range hasn't been created, create it now.
- // It's ok if two threads race and one overwrites the other's 'range' value.
- var newRange = new UnicodeRange(0, 0);
- Volatile.Write(ref range, newRange);
- return newRange;
- }
-
- [MethodImpl(MethodImplOptions.NoInlining)] // the caller should be inlined, not this method
- private static UnicodeRange CreateRange(ref UnicodeRange range, char first, char last)
- {
- // If the range hasn't been created, create it now.
- // It's ok if two threads race and one overwrites the other's 'range' value.
- Debug.Assert(last > first, "Code points were specified out of order.");
- var newRange = UnicodeRange.FromSpan(first, last);
- Volatile.Write(ref range, newRange);
- return newRange;
- }
- }
-}
diff --git a/src/Microsoft.Extensions.WebEncoders.Core/UnicodeRanges.generated.cs b/src/Microsoft.Extensions.WebEncoders.Core/UnicodeRanges.generated.cs
deleted file mode 100644
index ae2079a309..0000000000
--- a/src/Microsoft.Extensions.WebEncoders.Core/UnicodeRanges.generated.cs
+++ /dev/null
@@ -1,1415 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-using System.Threading;
-
-namespace Microsoft.Extensions.WebEncoders
-{
- public static partial class UnicodeRanges
- {
- ///
- /// A corresponding to the 'Basic Latin' Unicode block (U+0000..U+007F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U0000.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange BasicLatin => Volatile.Read(ref _basicLatin) ?? CreateRange(ref _basicLatin, first: '\u0000', last: '\u007F');
- private static UnicodeRange _basicLatin;
-
- ///
- /// A corresponding to the 'Latin-1 Supplement' Unicode block (U+0080..U+00FF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U0080.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Latin1Supplement => Volatile.Read(ref _latin1Supplement) ?? CreateRange(ref _latin1Supplement, first: '\u0080', last: '\u00FF');
- private static UnicodeRange _latin1Supplement;
-
- ///
- /// A corresponding to the 'Latin Extended-A' Unicode block (U+0100..U+017F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U0100.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange LatinExtendedA => Volatile.Read(ref _latinExtendedA) ?? CreateRange(ref _latinExtendedA, first: '\u0100', last: '\u017F');
- private static UnicodeRange _latinExtendedA;
-
- ///
- /// A corresponding to the 'Latin Extended-B' Unicode block (U+0180..U+024F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U0180.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange LatinExtendedB => Volatile.Read(ref _latinExtendedB) ?? CreateRange(ref _latinExtendedB, first: '\u0180', last: '\u024F');
- private static UnicodeRange _latinExtendedB;
-
- ///
- /// A corresponding to the 'IPA Extensions' Unicode block (U+0250..U+02AF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U0250.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange IPAExtensions => Volatile.Read(ref _ipaExtensions) ?? CreateRange(ref _ipaExtensions, first: '\u0250', last: '\u02AF');
- private static UnicodeRange _ipaExtensions;
-
- ///
- /// A corresponding to the 'Spacing Modifier Letters' Unicode block (U+02B0..U+02FF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U02B0.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange SpacingModifierLetters => Volatile.Read(ref _spacingModifierLetters) ?? CreateRange(ref _spacingModifierLetters, first: '\u02B0', last: '\u02FF');
- private static UnicodeRange _spacingModifierLetters;
-
- ///
- /// A corresponding to the 'Combining Diacritical Marks' Unicode block (U+0300..U+036F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U0300.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange CombiningDiacriticalMarks => Volatile.Read(ref _combiningDiacriticalMarks) ?? CreateRange(ref _combiningDiacriticalMarks, first: '\u0300', last: '\u036F');
- private static UnicodeRange _combiningDiacriticalMarks;
-
- ///
- /// A corresponding to the 'Greek and Coptic' Unicode block (U+0370..U+03FF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U0370.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange GreekandCoptic => Volatile.Read(ref _greekandCoptic) ?? CreateRange(ref _greekandCoptic, first: '\u0370', last: '\u03FF');
- private static UnicodeRange _greekandCoptic;
-
- ///
- /// A corresponding to the 'Cyrillic' Unicode block (U+0400..U+04FF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U0400.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Cyrillic => Volatile.Read(ref _cyrillic) ?? CreateRange(ref _cyrillic, first: '\u0400', last: '\u04FF');
- private static UnicodeRange _cyrillic;
-
- ///
- /// A corresponding to the 'Cyrillic Supplement' Unicode block (U+0500..U+052F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U0500.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange CyrillicSupplement => Volatile.Read(ref _cyrillicSupplement) ?? CreateRange(ref _cyrillicSupplement, first: '\u0500', last: '\u052F');
- private static UnicodeRange _cyrillicSupplement;
-
- ///
- /// A corresponding to the 'Armenian' Unicode block (U+0530..U+058F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U0530.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Armenian => Volatile.Read(ref _armenian) ?? CreateRange(ref _armenian, first: '\u0530', last: '\u058F');
- private static UnicodeRange _armenian;
-
- ///
- /// A corresponding to the 'Hebrew' Unicode block (U+0590..U+05FF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U0590.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Hebrew => Volatile.Read(ref _hebrew) ?? CreateRange(ref _hebrew, first: '\u0590', last: '\u05FF');
- private static UnicodeRange _hebrew;
-
- ///
- /// A corresponding to the 'Arabic' Unicode block (U+0600..U+06FF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U0600.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Arabic => Volatile.Read(ref _arabic) ?? CreateRange(ref _arabic, first: '\u0600', last: '\u06FF');
- private static UnicodeRange _arabic;
-
- ///
- /// A corresponding to the 'Syriac' Unicode block (U+0700..U+074F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U0700.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Syriac => Volatile.Read(ref _syriac) ?? CreateRange(ref _syriac, first: '\u0700', last: '\u074F');
- private static UnicodeRange _syriac;
-
- ///
- /// A corresponding to the 'Arabic Supplement' Unicode block (U+0750..U+077F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U0750.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange ArabicSupplement => Volatile.Read(ref _arabicSupplement) ?? CreateRange(ref _arabicSupplement, first: '\u0750', last: '\u077F');
- private static UnicodeRange _arabicSupplement;
-
- ///
- /// A corresponding to the 'Thaana' Unicode block (U+0780..U+07BF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U0780.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Thaana => Volatile.Read(ref _thaana) ?? CreateRange(ref _thaana, first: '\u0780', last: '\u07BF');
- private static UnicodeRange _thaana;
-
- ///
- /// A corresponding to the 'NKo' Unicode block (U+07C0..U+07FF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U07C0.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange NKo => Volatile.Read(ref _nKo) ?? CreateRange(ref _nKo, first: '\u07C0', last: '\u07FF');
- private static UnicodeRange _nKo;
-
- ///
- /// A corresponding to the 'Samaritan' Unicode block (U+0800..U+083F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U0800.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Samaritan => Volatile.Read(ref _samaritan) ?? CreateRange(ref _samaritan, first: '\u0800', last: '\u083F');
- private static UnicodeRange _samaritan;
-
- ///
- /// A corresponding to the 'Mandaic' Unicode block (U+0840..U+085F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U0840.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Mandaic => Volatile.Read(ref _mandaic) ?? CreateRange(ref _mandaic, first: '\u0840', last: '\u085F');
- private static UnicodeRange _mandaic;
-
- ///
- /// A corresponding to the 'Arabic Extended-A' Unicode block (U+08A0..U+08FF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U08A0.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange ArabicExtendedA => Volatile.Read(ref _arabicExtendedA) ?? CreateRange(ref _arabicExtendedA, first: '\u08A0', last: '\u08FF');
- private static UnicodeRange _arabicExtendedA;
-
- ///
- /// A corresponding to the 'Devanagari' Unicode block (U+0900..U+097F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U0900.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Devanagari => Volatile.Read(ref _devanagari) ?? CreateRange(ref _devanagari, first: '\u0900', last: '\u097F');
- private static UnicodeRange _devanagari;
-
- ///
- /// A corresponding to the 'Bengali' Unicode block (U+0980..U+09FF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U0980.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Bengali => Volatile.Read(ref _bengali) ?? CreateRange(ref _bengali, first: '\u0980', last: '\u09FF');
- private static UnicodeRange _bengali;
-
- ///
- /// A corresponding to the 'Gurmukhi' Unicode block (U+0A00..U+0A7F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U0A00.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Gurmukhi => Volatile.Read(ref _gurmukhi) ?? CreateRange(ref _gurmukhi, first: '\u0A00', last: '\u0A7F');
- private static UnicodeRange _gurmukhi;
-
- ///
- /// A corresponding to the 'Gujarati' Unicode block (U+0A80..U+0AFF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U0A80.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Gujarati => Volatile.Read(ref _gujarati) ?? CreateRange(ref _gujarati, first: '\u0A80', last: '\u0AFF');
- private static UnicodeRange _gujarati;
-
- ///
- /// A corresponding to the 'Oriya' Unicode block (U+0B00..U+0B7F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U0B00.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Oriya => Volatile.Read(ref _oriya) ?? CreateRange(ref _oriya, first: '\u0B00', last: '\u0B7F');
- private static UnicodeRange _oriya;
-
- ///
- /// A corresponding to the 'Tamil' Unicode block (U+0B80..U+0BFF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U0B80.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Tamil => Volatile.Read(ref _tamil) ?? CreateRange(ref _tamil, first: '\u0B80', last: '\u0BFF');
- private static UnicodeRange _tamil;
-
- ///
- /// A corresponding to the 'Telugu' Unicode block (U+0C00..U+0C7F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U0C00.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Telugu => Volatile.Read(ref _telugu) ?? CreateRange(ref _telugu, first: '\u0C00', last: '\u0C7F');
- private static UnicodeRange _telugu;
-
- ///
- /// A corresponding to the 'Kannada' Unicode block (U+0C80..U+0CFF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U0C80.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Kannada => Volatile.Read(ref _kannada) ?? CreateRange(ref _kannada, first: '\u0C80', last: '\u0CFF');
- private static UnicodeRange _kannada;
-
- ///
- /// A corresponding to the 'Malayalam' Unicode block (U+0D00..U+0D7F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U0D00.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Malayalam => Volatile.Read(ref _malayalam) ?? CreateRange(ref _malayalam, first: '\u0D00', last: '\u0D7F');
- private static UnicodeRange _malayalam;
-
- ///
- /// A corresponding to the 'Sinhala' Unicode block (U+0D80..U+0DFF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U0D80.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Sinhala => Volatile.Read(ref _sinhala) ?? CreateRange(ref _sinhala, first: '\u0D80', last: '\u0DFF');
- private static UnicodeRange _sinhala;
-
- ///
- /// A corresponding to the 'Thai' Unicode block (U+0E00..U+0E7F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U0E00.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Thai => Volatile.Read(ref _thai) ?? CreateRange(ref _thai, first: '\u0E00', last: '\u0E7F');
- private static UnicodeRange _thai;
-
- ///
- /// A corresponding to the 'Lao' Unicode block (U+0E80..U+0EFF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U0E80.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Lao => Volatile.Read(ref _lao) ?? CreateRange(ref _lao, first: '\u0E80', last: '\u0EFF');
- private static UnicodeRange _lao;
-
- ///
- /// A corresponding to the 'Tibetan' Unicode block (U+0F00..U+0FFF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U0F00.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Tibetan => Volatile.Read(ref _tibetan) ?? CreateRange(ref _tibetan, first: '\u0F00', last: '\u0FFF');
- private static UnicodeRange _tibetan;
-
- ///
- /// A corresponding to the 'Myanmar' Unicode block (U+1000..U+109F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U1000.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Myanmar => Volatile.Read(ref _myanmar) ?? CreateRange(ref _myanmar, first: '\u1000', last: '\u109F');
- private static UnicodeRange _myanmar;
-
- ///
- /// A corresponding to the 'Georgian' Unicode block (U+10A0..U+10FF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U10A0.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Georgian => Volatile.Read(ref _georgian) ?? CreateRange(ref _georgian, first: '\u10A0', last: '\u10FF');
- private static UnicodeRange _georgian;
-
- ///
- /// A corresponding to the 'Hangul Jamo' Unicode block (U+1100..U+11FF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U1100.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange HangulJamo => Volatile.Read(ref _hangulJamo) ?? CreateRange(ref _hangulJamo, first: '\u1100', last: '\u11FF');
- private static UnicodeRange _hangulJamo;
-
- ///
- /// A corresponding to the 'Ethiopic' Unicode block (U+1200..U+137F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U1200.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Ethiopic => Volatile.Read(ref _ethiopic) ?? CreateRange(ref _ethiopic, first: '\u1200', last: '\u137F');
- private static UnicodeRange _ethiopic;
-
- ///
- /// A corresponding to the 'Ethiopic Supplement' Unicode block (U+1380..U+139F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U1380.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange EthiopicSupplement => Volatile.Read(ref _ethiopicSupplement) ?? CreateRange(ref _ethiopicSupplement, first: '\u1380', last: '\u139F');
- private static UnicodeRange _ethiopicSupplement;
-
- ///
- /// A corresponding to the 'Cherokee' Unicode block (U+13A0..U+13FF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U13A0.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Cherokee => Volatile.Read(ref _cherokee) ?? CreateRange(ref _cherokee, first: '\u13A0', last: '\u13FF');
- private static UnicodeRange _cherokee;
-
- ///
- /// A corresponding to the 'Unified Canadian Aboriginal Syllabics' Unicode block (U+1400..U+167F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U1400.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange UnifiedCanadianAboriginalSyllabics => Volatile.Read(ref _unifiedCanadianAboriginalSyllabics) ?? CreateRange(ref _unifiedCanadianAboriginalSyllabics, first: '\u1400', last: '\u167F');
- private static UnicodeRange _unifiedCanadianAboriginalSyllabics;
-
- ///
- /// A corresponding to the 'Ogham' Unicode block (U+1680..U+169F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U1680.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Ogham => Volatile.Read(ref _ogham) ?? CreateRange(ref _ogham, first: '\u1680', last: '\u169F');
- private static UnicodeRange _ogham;
-
- ///
- /// A corresponding to the 'Runic' Unicode block (U+16A0..U+16FF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U16A0.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Runic => Volatile.Read(ref _runic) ?? CreateRange(ref _runic, first: '\u16A0', last: '\u16FF');
- private static UnicodeRange _runic;
-
- ///
- /// A corresponding to the 'Tagalog' Unicode block (U+1700..U+171F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U1700.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Tagalog => Volatile.Read(ref _tagalog) ?? CreateRange(ref _tagalog, first: '\u1700', last: '\u171F');
- private static UnicodeRange _tagalog;
-
- ///
- /// A corresponding to the 'Hanunoo' Unicode block (U+1720..U+173F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U1720.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Hanunoo => Volatile.Read(ref _hanunoo) ?? CreateRange(ref _hanunoo, first: '\u1720', last: '\u173F');
- private static UnicodeRange _hanunoo;
-
- ///
- /// A corresponding to the 'Buhid' Unicode block (U+1740..U+175F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U1740.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Buhid => Volatile.Read(ref _buhid) ?? CreateRange(ref _buhid, first: '\u1740', last: '\u175F');
- private static UnicodeRange _buhid;
-
- ///
- /// A corresponding to the 'Tagbanwa' Unicode block (U+1760..U+177F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U1760.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Tagbanwa => Volatile.Read(ref _tagbanwa) ?? CreateRange(ref _tagbanwa, first: '\u1760', last: '\u177F');
- private static UnicodeRange _tagbanwa;
-
- ///
- /// A corresponding to the 'Khmer' Unicode block (U+1780..U+17FF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U1780.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Khmer => Volatile.Read(ref _khmer) ?? CreateRange(ref _khmer, first: '\u1780', last: '\u17FF');
- private static UnicodeRange _khmer;
-
- ///
- /// A corresponding to the 'Mongolian' Unicode block (U+1800..U+18AF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U1800.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Mongolian => Volatile.Read(ref _mongolian) ?? CreateRange(ref _mongolian, first: '\u1800', last: '\u18AF');
- private static UnicodeRange _mongolian;
-
- ///
- /// A corresponding to the 'Unified Canadian Aboriginal Syllabics Extended' Unicode block (U+18B0..U+18FF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U18B0.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange UnifiedCanadianAboriginalSyllabicsExtended => Volatile.Read(ref _unifiedCanadianAboriginalSyllabicsExtended) ?? CreateRange(ref _unifiedCanadianAboriginalSyllabicsExtended, first: '\u18B0', last: '\u18FF');
- private static UnicodeRange _unifiedCanadianAboriginalSyllabicsExtended;
-
- ///
- /// A corresponding to the 'Limbu' Unicode block (U+1900..U+194F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U1900.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Limbu => Volatile.Read(ref _limbu) ?? CreateRange(ref _limbu, first: '\u1900', last: '\u194F');
- private static UnicodeRange _limbu;
-
- ///
- /// A corresponding to the 'Tai Le' Unicode block (U+1950..U+197F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U1950.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange TaiLe => Volatile.Read(ref _taiLe) ?? CreateRange(ref _taiLe, first: '\u1950', last: '\u197F');
- private static UnicodeRange _taiLe;
-
- ///
- /// A corresponding to the 'New Tai Lue' Unicode block (U+1980..U+19DF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U1980.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange NewTaiLue => Volatile.Read(ref _newTaiLue) ?? CreateRange(ref _newTaiLue, first: '\u1980', last: '\u19DF');
- private static UnicodeRange _newTaiLue;
-
- ///
- /// A corresponding to the 'Khmer Symbols' Unicode block (U+19E0..U+19FF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U19E0.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange KhmerSymbols => Volatile.Read(ref _khmerSymbols) ?? CreateRange(ref _khmerSymbols, first: '\u19E0', last: '\u19FF');
- private static UnicodeRange _khmerSymbols;
-
- ///
- /// A corresponding to the 'Buginese' Unicode block (U+1A00..U+1A1F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U1A00.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Buginese => Volatile.Read(ref _buginese) ?? CreateRange(ref _buginese, first: '\u1A00', last: '\u1A1F');
- private static UnicodeRange _buginese;
-
- ///
- /// A corresponding to the 'Tai Tham' Unicode block (U+1A20..U+1AAF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U1A20.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange TaiTham => Volatile.Read(ref _taiTham) ?? CreateRange(ref _taiTham, first: '\u1A20', last: '\u1AAF');
- private static UnicodeRange _taiTham;
-
- ///
- /// A corresponding to the 'Combining Diacritical Marks Extended' Unicode block (U+1AB0..U+1AFF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U1AB0.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange CombiningDiacriticalMarksExtended => Volatile.Read(ref _combiningDiacriticalMarksExtended) ?? CreateRange(ref _combiningDiacriticalMarksExtended, first: '\u1AB0', last: '\u1AFF');
- private static UnicodeRange _combiningDiacriticalMarksExtended;
-
- ///
- /// A corresponding to the 'Balinese' Unicode block (U+1B00..U+1B7F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U1B00.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Balinese => Volatile.Read(ref _balinese) ?? CreateRange(ref _balinese, first: '\u1B00', last: '\u1B7F');
- private static UnicodeRange _balinese;
-
- ///
- /// A corresponding to the 'Sundanese' Unicode block (U+1B80..U+1BBF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U1B80.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Sundanese => Volatile.Read(ref _sundanese) ?? CreateRange(ref _sundanese, first: '\u1B80', last: '\u1BBF');
- private static UnicodeRange _sundanese;
-
- ///
- /// A corresponding to the 'Batak' Unicode block (U+1BC0..U+1BFF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U1BC0.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Batak => Volatile.Read(ref _batak) ?? CreateRange(ref _batak, first: '\u1BC0', last: '\u1BFF');
- private static UnicodeRange _batak;
-
- ///
- /// A corresponding to the 'Lepcha' Unicode block (U+1C00..U+1C4F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U1C00.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Lepcha => Volatile.Read(ref _lepcha) ?? CreateRange(ref _lepcha, first: '\u1C00', last: '\u1C4F');
- private static UnicodeRange _lepcha;
-
- ///
- /// A corresponding to the 'Ol Chiki' Unicode block (U+1C50..U+1C7F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U1C50.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange OlChiki => Volatile.Read(ref _olChiki) ?? CreateRange(ref _olChiki, first: '\u1C50', last: '\u1C7F');
- private static UnicodeRange _olChiki;
-
- ///
- /// A corresponding to the 'Sundanese Supplement' Unicode block (U+1CC0..U+1CCF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U1CC0.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange SundaneseSupplement => Volatile.Read(ref _sundaneseSupplement) ?? CreateRange(ref _sundaneseSupplement, first: '\u1CC0', last: '\u1CCF');
- private static UnicodeRange _sundaneseSupplement;
-
- ///
- /// A corresponding to the 'Vedic Extensions' Unicode block (U+1CD0..U+1CFF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U1CD0.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange VedicExtensions => Volatile.Read(ref _vedicExtensions) ?? CreateRange(ref _vedicExtensions, first: '\u1CD0', last: '\u1CFF');
- private static UnicodeRange _vedicExtensions;
-
- ///
- /// A corresponding to the 'Phonetic Extensions' Unicode block (U+1D00..U+1D7F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U1D00.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange PhoneticExtensions => Volatile.Read(ref _phoneticExtensions) ?? CreateRange(ref _phoneticExtensions, first: '\u1D00', last: '\u1D7F');
- private static UnicodeRange _phoneticExtensions;
-
- ///
- /// A corresponding to the 'Phonetic Extensions Supplement' Unicode block (U+1D80..U+1DBF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U1D80.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange PhoneticExtensionsSupplement => Volatile.Read(ref _phoneticExtensionsSupplement) ?? CreateRange(ref _phoneticExtensionsSupplement, first: '\u1D80', last: '\u1DBF');
- private static UnicodeRange _phoneticExtensionsSupplement;
-
- ///
- /// A corresponding to the 'Combining Diacritical Marks Supplement' Unicode block (U+1DC0..U+1DFF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U1DC0.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange CombiningDiacriticalMarksSupplement => Volatile.Read(ref _combiningDiacriticalMarksSupplement) ?? CreateRange(ref _combiningDiacriticalMarksSupplement, first: '\u1DC0', last: '\u1DFF');
- private static UnicodeRange _combiningDiacriticalMarksSupplement;
-
- ///
- /// A corresponding to the 'Latin Extended Additional' Unicode block (U+1E00..U+1EFF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U1E00.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange LatinExtendedAdditional => Volatile.Read(ref _latinExtendedAdditional) ?? CreateRange(ref _latinExtendedAdditional, first: '\u1E00', last: '\u1EFF');
- private static UnicodeRange _latinExtendedAdditional;
-
- ///
- /// A corresponding to the 'Greek Extended' Unicode block (U+1F00..U+1FFF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U1F00.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange GreekExtended => Volatile.Read(ref _greekExtended) ?? CreateRange(ref _greekExtended, first: '\u1F00', last: '\u1FFF');
- private static UnicodeRange _greekExtended;
-
- ///
- /// A corresponding to the 'General Punctuation' Unicode block (U+2000..U+206F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U2000.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange GeneralPunctuation => Volatile.Read(ref _generalPunctuation) ?? CreateRange(ref _generalPunctuation, first: '\u2000', last: '\u206F');
- private static UnicodeRange _generalPunctuation;
-
- ///
- /// A corresponding to the 'Superscripts and Subscripts' Unicode block (U+2070..U+209F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U2070.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange SuperscriptsandSubscripts => Volatile.Read(ref _superscriptsandSubscripts) ?? CreateRange(ref _superscriptsandSubscripts, first: '\u2070', last: '\u209F');
- private static UnicodeRange _superscriptsandSubscripts;
-
- ///
- /// A corresponding to the 'Currency Symbols' Unicode block (U+20A0..U+20CF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U20A0.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange CurrencySymbols => Volatile.Read(ref _currencySymbols) ?? CreateRange(ref _currencySymbols, first: '\u20A0', last: '\u20CF');
- private static UnicodeRange _currencySymbols;
-
- ///
- /// A corresponding to the 'Combining Diacritical Marks for Symbols' Unicode block (U+20D0..U+20FF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U20D0.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange CombiningDiacriticalMarksforSymbols => Volatile.Read(ref _combiningDiacriticalMarksforSymbols) ?? CreateRange(ref _combiningDiacriticalMarksforSymbols, first: '\u20D0', last: '\u20FF');
- private static UnicodeRange _combiningDiacriticalMarksforSymbols;
-
- ///
- /// A corresponding to the 'Letterlike Symbols' Unicode block (U+2100..U+214F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U2100.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange LetterlikeSymbols => Volatile.Read(ref _letterlikeSymbols) ?? CreateRange(ref _letterlikeSymbols, first: '\u2100', last: '\u214F');
- private static UnicodeRange _letterlikeSymbols;
-
- ///
- /// A corresponding to the 'Number Forms' Unicode block (U+2150..U+218F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U2150.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange NumberForms => Volatile.Read(ref _numberForms) ?? CreateRange(ref _numberForms, first: '\u2150', last: '\u218F');
- private static UnicodeRange _numberForms;
-
- ///
- /// A corresponding to the 'Arrows' Unicode block (U+2190..U+21FF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U2190.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Arrows => Volatile.Read(ref _arrows) ?? CreateRange(ref _arrows, first: '\u2190', last: '\u21FF');
- private static UnicodeRange _arrows;
-
- ///
- /// A corresponding to the 'Mathematical Operators' Unicode block (U+2200..U+22FF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U2200.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange MathematicalOperators => Volatile.Read(ref _mathematicalOperators) ?? CreateRange(ref _mathematicalOperators, first: '\u2200', last: '\u22FF');
- private static UnicodeRange _mathematicalOperators;
-
- ///
- /// A corresponding to the 'Miscellaneous Technical' Unicode block (U+2300..U+23FF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U2300.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange MiscellaneousTechnical => Volatile.Read(ref _miscellaneousTechnical) ?? CreateRange(ref _miscellaneousTechnical, first: '\u2300', last: '\u23FF');
- private static UnicodeRange _miscellaneousTechnical;
-
- ///
- /// A corresponding to the 'Control Pictures' Unicode block (U+2400..U+243F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U2400.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange ControlPictures => Volatile.Read(ref _controlPictures) ?? CreateRange(ref _controlPictures, first: '\u2400', last: '\u243F');
- private static UnicodeRange _controlPictures;
-
- ///
- /// A corresponding to the 'Optical Character Recognition' Unicode block (U+2440..U+245F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U2440.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange OpticalCharacterRecognition => Volatile.Read(ref _opticalCharacterRecognition) ?? CreateRange(ref _opticalCharacterRecognition, first: '\u2440', last: '\u245F');
- private static UnicodeRange _opticalCharacterRecognition;
-
- ///
- /// A corresponding to the 'Enclosed Alphanumerics' Unicode block (U+2460..U+24FF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U2460.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange EnclosedAlphanumerics => Volatile.Read(ref _enclosedAlphanumerics) ?? CreateRange(ref _enclosedAlphanumerics, first: '\u2460', last: '\u24FF');
- private static UnicodeRange _enclosedAlphanumerics;
-
- ///
- /// A corresponding to the 'Box Drawing' Unicode block (U+2500..U+257F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U2500.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange BoxDrawing => Volatile.Read(ref _boxDrawing) ?? CreateRange(ref _boxDrawing, first: '\u2500', last: '\u257F');
- private static UnicodeRange _boxDrawing;
-
- ///
- /// A corresponding to the 'Block Elements' Unicode block (U+2580..U+259F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U2580.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange BlockElements => Volatile.Read(ref _blockElements) ?? CreateRange(ref _blockElements, first: '\u2580', last: '\u259F');
- private static UnicodeRange _blockElements;
-
- ///
- /// A corresponding to the 'Geometric Shapes' Unicode block (U+25A0..U+25FF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U25A0.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange GeometricShapes => Volatile.Read(ref _geometricShapes) ?? CreateRange(ref _geometricShapes, first: '\u25A0', last: '\u25FF');
- private static UnicodeRange _geometricShapes;
-
- ///
- /// A corresponding to the 'Miscellaneous Symbols' Unicode block (U+2600..U+26FF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U2600.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange MiscellaneousSymbols => Volatile.Read(ref _miscellaneousSymbols) ?? CreateRange(ref _miscellaneousSymbols, first: '\u2600', last: '\u26FF');
- private static UnicodeRange _miscellaneousSymbols;
-
- ///
- /// A corresponding to the 'Dingbats' Unicode block (U+2700..U+27BF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U2700.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Dingbats => Volatile.Read(ref _dingbats) ?? CreateRange(ref _dingbats, first: '\u2700', last: '\u27BF');
- private static UnicodeRange _dingbats;
-
- ///
- /// A corresponding to the 'Miscellaneous Mathematical Symbols-A' Unicode block (U+27C0..U+27EF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U27C0.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange MiscellaneousMathematicalSymbolsA => Volatile.Read(ref _miscellaneousMathematicalSymbolsA) ?? CreateRange(ref _miscellaneousMathematicalSymbolsA, first: '\u27C0', last: '\u27EF');
- private static UnicodeRange _miscellaneousMathematicalSymbolsA;
-
- ///
- /// A corresponding to the 'Supplemental Arrows-A' Unicode block (U+27F0..U+27FF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U27F0.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange SupplementalArrowsA => Volatile.Read(ref _supplementalArrowsA) ?? CreateRange(ref _supplementalArrowsA, first: '\u27F0', last: '\u27FF');
- private static UnicodeRange _supplementalArrowsA;
-
- ///
- /// A corresponding to the 'Braille Patterns' Unicode block (U+2800..U+28FF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U2800.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange BraillePatterns => Volatile.Read(ref _braillePatterns) ?? CreateRange(ref _braillePatterns, first: '\u2800', last: '\u28FF');
- private static UnicodeRange _braillePatterns;
-
- ///
- /// A corresponding to the 'Supplemental Arrows-B' Unicode block (U+2900..U+297F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U2900.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange SupplementalArrowsB => Volatile.Read(ref _supplementalArrowsB) ?? CreateRange(ref _supplementalArrowsB, first: '\u2900', last: '\u297F');
- private static UnicodeRange _supplementalArrowsB;
-
- ///
- /// A corresponding to the 'Miscellaneous Mathematical Symbols-B' Unicode block (U+2980..U+29FF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U2980.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange MiscellaneousMathematicalSymbolsB => Volatile.Read(ref _miscellaneousMathematicalSymbolsB) ?? CreateRange(ref _miscellaneousMathematicalSymbolsB, first: '\u2980', last: '\u29FF');
- private static UnicodeRange _miscellaneousMathematicalSymbolsB;
-
- ///
- /// A corresponding to the 'Supplemental Mathematical Operators' Unicode block (U+2A00..U+2AFF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U2A00.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange SupplementalMathematicalOperators => Volatile.Read(ref _supplementalMathematicalOperators) ?? CreateRange(ref _supplementalMathematicalOperators, first: '\u2A00', last: '\u2AFF');
- private static UnicodeRange _supplementalMathematicalOperators;
-
- ///
- /// A corresponding to the 'Miscellaneous Symbols and Arrows' Unicode block (U+2B00..U+2BFF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U2B00.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange MiscellaneousSymbolsandArrows => Volatile.Read(ref _miscellaneousSymbolsandArrows) ?? CreateRange(ref _miscellaneousSymbolsandArrows, first: '\u2B00', last: '\u2BFF');
- private static UnicodeRange _miscellaneousSymbolsandArrows;
-
- ///
- /// A corresponding to the 'Glagolitic' Unicode block (U+2C00..U+2C5F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U2C00.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Glagolitic => Volatile.Read(ref _glagolitic) ?? CreateRange(ref _glagolitic, first: '\u2C00', last: '\u2C5F');
- private static UnicodeRange _glagolitic;
-
- ///
- /// A corresponding to the 'Latin Extended-C' Unicode block (U+2C60..U+2C7F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U2C60.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange LatinExtendedC => Volatile.Read(ref _latinExtendedC) ?? CreateRange(ref _latinExtendedC, first: '\u2C60', last: '\u2C7F');
- private static UnicodeRange _latinExtendedC;
-
- ///
- /// A corresponding to the 'Coptic' Unicode block (U+2C80..U+2CFF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U2C80.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Coptic => Volatile.Read(ref _coptic) ?? CreateRange(ref _coptic, first: '\u2C80', last: '\u2CFF');
- private static UnicodeRange _coptic;
-
- ///
- /// A corresponding to the 'Georgian Supplement' Unicode block (U+2D00..U+2D2F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U2D00.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange GeorgianSupplement => Volatile.Read(ref _georgianSupplement) ?? CreateRange(ref _georgianSupplement, first: '\u2D00', last: '\u2D2F');
- private static UnicodeRange _georgianSupplement;
-
- ///
- /// A corresponding to the 'Tifinagh' Unicode block (U+2D30..U+2D7F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U2D30.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Tifinagh => Volatile.Read(ref _tifinagh) ?? CreateRange(ref _tifinagh, first: '\u2D30', last: '\u2D7F');
- private static UnicodeRange _tifinagh;
-
- ///
- /// A corresponding to the 'Ethiopic Extended' Unicode block (U+2D80..U+2DDF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U2D80.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange EthiopicExtended => Volatile.Read(ref _ethiopicExtended) ?? CreateRange(ref _ethiopicExtended, first: '\u2D80', last: '\u2DDF');
- private static UnicodeRange _ethiopicExtended;
-
- ///
- /// A corresponding to the 'Cyrillic Extended-A' Unicode block (U+2DE0..U+2DFF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U2DE0.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange CyrillicExtendedA => Volatile.Read(ref _cyrillicExtendedA) ?? CreateRange(ref _cyrillicExtendedA, first: '\u2DE0', last: '\u2DFF');
- private static UnicodeRange _cyrillicExtendedA;
-
- ///
- /// A corresponding to the 'Supplemental Punctuation' Unicode block (U+2E00..U+2E7F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U2E00.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange SupplementalPunctuation => Volatile.Read(ref _supplementalPunctuation) ?? CreateRange(ref _supplementalPunctuation, first: '\u2E00', last: '\u2E7F');
- private static UnicodeRange _supplementalPunctuation;
-
- ///
- /// A corresponding to the 'CJK Radicals Supplement' Unicode block (U+2E80..U+2EFF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U2E80.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange CJKRadicalsSupplement => Volatile.Read(ref _cjkRadicalsSupplement) ?? CreateRange(ref _cjkRadicalsSupplement, first: '\u2E80', last: '\u2EFF');
- private static UnicodeRange _cjkRadicalsSupplement;
-
- ///
- /// A corresponding to the 'Kangxi Radicals' Unicode block (U+2F00..U+2FDF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U2F00.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange KangxiRadicals => Volatile.Read(ref _kangxiRadicals) ?? CreateRange(ref _kangxiRadicals, first: '\u2F00', last: '\u2FDF');
- private static UnicodeRange _kangxiRadicals;
-
- ///
- /// A corresponding to the 'Ideographic Description Characters' Unicode block (U+2FF0..U+2FFF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U2FF0.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange IdeographicDescriptionCharacters => Volatile.Read(ref _ideographicDescriptionCharacters) ?? CreateRange(ref _ideographicDescriptionCharacters, first: '\u2FF0', last: '\u2FFF');
- private static UnicodeRange _ideographicDescriptionCharacters;
-
- ///
- /// A corresponding to the 'CJK Symbols and Punctuation' Unicode block (U+3000..U+303F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U3000.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange CJKSymbolsandPunctuation => Volatile.Read(ref _cjkSymbolsandPunctuation) ?? CreateRange(ref _cjkSymbolsandPunctuation, first: '\u3000', last: '\u303F');
- private static UnicodeRange _cjkSymbolsandPunctuation;
-
- ///
- /// A corresponding to the 'Hiragana' Unicode block (U+3040..U+309F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U3040.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Hiragana => Volatile.Read(ref _hiragana) ?? CreateRange(ref _hiragana, first: '\u3040', last: '\u309F');
- private static UnicodeRange _hiragana;
-
- ///
- /// A corresponding to the 'Katakana' Unicode block (U+30A0..U+30FF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U30A0.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Katakana => Volatile.Read(ref _katakana) ?? CreateRange(ref _katakana, first: '\u30A0', last: '\u30FF');
- private static UnicodeRange _katakana;
-
- ///
- /// A corresponding to the 'Bopomofo' Unicode block (U+3100..U+312F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U3100.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Bopomofo => Volatile.Read(ref _bopomofo) ?? CreateRange(ref _bopomofo, first: '\u3100', last: '\u312F');
- private static UnicodeRange _bopomofo;
-
- ///
- /// A corresponding to the 'Hangul Compatibility Jamo' Unicode block (U+3130..U+318F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U3130.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange HangulCompatibilityJamo => Volatile.Read(ref _hangulCompatibilityJamo) ?? CreateRange(ref _hangulCompatibilityJamo, first: '\u3130', last: '\u318F');
- private static UnicodeRange _hangulCompatibilityJamo;
-
- ///
- /// A corresponding to the 'Kanbun' Unicode block (U+3190..U+319F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U3190.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Kanbun => Volatile.Read(ref _kanbun) ?? CreateRange(ref _kanbun, first: '\u3190', last: '\u319F');
- private static UnicodeRange _kanbun;
-
- ///
- /// A corresponding to the 'Bopomofo Extended' Unicode block (U+31A0..U+31BF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U31A0.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange BopomofoExtended => Volatile.Read(ref _bopomofoExtended) ?? CreateRange(ref _bopomofoExtended, first: '\u31A0', last: '\u31BF');
- private static UnicodeRange _bopomofoExtended;
-
- ///
- /// A corresponding to the 'CJK Strokes' Unicode block (U+31C0..U+31EF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U31C0.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange CJKStrokes => Volatile.Read(ref _cjkStrokes) ?? CreateRange(ref _cjkStrokes, first: '\u31C0', last: '\u31EF');
- private static UnicodeRange _cjkStrokes;
-
- ///
- /// A corresponding to the 'Katakana Phonetic Extensions' Unicode block (U+31F0..U+31FF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U31F0.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange KatakanaPhoneticExtensions => Volatile.Read(ref _katakanaPhoneticExtensions) ?? CreateRange(ref _katakanaPhoneticExtensions, first: '\u31F0', last: '\u31FF');
- private static UnicodeRange _katakanaPhoneticExtensions;
-
- ///
- /// A corresponding to the 'Enclosed CJK Letters and Months' Unicode block (U+3200..U+32FF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U3200.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange EnclosedCJKLettersandMonths => Volatile.Read(ref _enclosedCJKLettersandMonths) ?? CreateRange(ref _enclosedCJKLettersandMonths, first: '\u3200', last: '\u32FF');
- private static UnicodeRange _enclosedCJKLettersandMonths;
-
- ///
- /// A corresponding to the 'CJK Compatibility' Unicode block (U+3300..U+33FF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U3300.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange CJKCompatibility => Volatile.Read(ref _cjkCompatibility) ?? CreateRange(ref _cjkCompatibility, first: '\u3300', last: '\u33FF');
- private static UnicodeRange _cjkCompatibility;
-
- ///
- /// A corresponding to the 'CJK Unified Ideographs Extension A' Unicode block (U+3400..U+4DBF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U3400.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange CJKUnifiedIdeographsExtensionA => Volatile.Read(ref _cjkUnifiedIdeographsExtensionA) ?? CreateRange(ref _cjkUnifiedIdeographsExtensionA, first: '\u3400', last: '\u4DBF');
- private static UnicodeRange _cjkUnifiedIdeographsExtensionA;
-
- ///
- /// A corresponding to the 'Yijing Hexagram Symbols' Unicode block (U+4DC0..U+4DFF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U4DC0.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange YijingHexagramSymbols => Volatile.Read(ref _yijingHexagramSymbols) ?? CreateRange(ref _yijingHexagramSymbols, first: '\u4DC0', last: '\u4DFF');
- private static UnicodeRange _yijingHexagramSymbols;
-
- ///
- /// A corresponding to the 'CJK Unified Ideographs' Unicode block (U+4E00..U+9FFF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/U4E00.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange CJKUnifiedIdeographs => Volatile.Read(ref _cjkUnifiedIdeographs) ?? CreateRange(ref _cjkUnifiedIdeographs, first: '\u4E00', last: '\u9FFF');
- private static UnicodeRange _cjkUnifiedIdeographs;
-
- ///
- /// A corresponding to the 'Yi Syllables' Unicode block (U+A000..U+A48F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/UA000.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange YiSyllables => Volatile.Read(ref _yiSyllables) ?? CreateRange(ref _yiSyllables, first: '\uA000', last: '\uA48F');
- private static UnicodeRange _yiSyllables;
-
- ///
- /// A corresponding to the 'Yi Radicals' Unicode block (U+A490..U+A4CF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/UA490.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange YiRadicals => Volatile.Read(ref _yiRadicals) ?? CreateRange(ref _yiRadicals, first: '\uA490', last: '\uA4CF');
- private static UnicodeRange _yiRadicals;
-
- ///
- /// A corresponding to the 'Lisu' Unicode block (U+A4D0..U+A4FF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/UA4D0.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Lisu => Volatile.Read(ref _lisu) ?? CreateRange(ref _lisu, first: '\uA4D0', last: '\uA4FF');
- private static UnicodeRange _lisu;
-
- ///
- /// A corresponding to the 'Vai' Unicode block (U+A500..U+A63F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/UA500.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Vai => Volatile.Read(ref _vai) ?? CreateRange(ref _vai, first: '\uA500', last: '\uA63F');
- private static UnicodeRange _vai;
-
- ///
- /// A corresponding to the 'Cyrillic Extended-B' Unicode block (U+A640..U+A69F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/UA640.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange CyrillicExtendedB => Volatile.Read(ref _cyrillicExtendedB) ?? CreateRange(ref _cyrillicExtendedB, first: '\uA640', last: '\uA69F');
- private static UnicodeRange _cyrillicExtendedB;
-
- ///
- /// A corresponding to the 'Bamum' Unicode block (U+A6A0..U+A6FF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/UA6A0.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Bamum => Volatile.Read(ref _bamum) ?? CreateRange(ref _bamum, first: '\uA6A0', last: '\uA6FF');
- private static UnicodeRange _bamum;
-
- ///
- /// A corresponding to the 'Modifier Tone Letters' Unicode block (U+A700..U+A71F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/UA700.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange ModifierToneLetters => Volatile.Read(ref _modifierToneLetters) ?? CreateRange(ref _modifierToneLetters, first: '\uA700', last: '\uA71F');
- private static UnicodeRange _modifierToneLetters;
-
- ///
- /// A corresponding to the 'Latin Extended-D' Unicode block (U+A720..U+A7FF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/UA720.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange LatinExtendedD => Volatile.Read(ref _latinExtendedD) ?? CreateRange(ref _latinExtendedD, first: '\uA720', last: '\uA7FF');
- private static UnicodeRange _latinExtendedD;
-
- ///
- /// A corresponding to the 'Syloti Nagri' Unicode block (U+A800..U+A82F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/UA800.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange SylotiNagri => Volatile.Read(ref _sylotiNagri) ?? CreateRange(ref _sylotiNagri, first: '\uA800', last: '\uA82F');
- private static UnicodeRange _sylotiNagri;
-
- ///
- /// A corresponding to the 'Common Indic Number Forms' Unicode block (U+A830..U+A83F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/UA830.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange CommonIndicNumberForms => Volatile.Read(ref _commonIndicNumberForms) ?? CreateRange(ref _commonIndicNumberForms, first: '\uA830', last: '\uA83F');
- private static UnicodeRange _commonIndicNumberForms;
-
- ///
- /// A corresponding to the 'Phags-pa' Unicode block (U+A840..U+A87F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/UA840.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Phagspa => Volatile.Read(ref _phagspa) ?? CreateRange(ref _phagspa, first: '\uA840', last: '\uA87F');
- private static UnicodeRange _phagspa;
-
- ///
- /// A corresponding to the 'Saurashtra' Unicode block (U+A880..U+A8DF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/UA880.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Saurashtra => Volatile.Read(ref _saurashtra) ?? CreateRange(ref _saurashtra, first: '\uA880', last: '\uA8DF');
- private static UnicodeRange _saurashtra;
-
- ///
- /// A corresponding to the 'Devanagari Extended' Unicode block (U+A8E0..U+A8FF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/UA8E0.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange DevanagariExtended => Volatile.Read(ref _devanagariExtended) ?? CreateRange(ref _devanagariExtended, first: '\uA8E0', last: '\uA8FF');
- private static UnicodeRange _devanagariExtended;
-
- ///
- /// A corresponding to the 'Kayah Li' Unicode block (U+A900..U+A92F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/UA900.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange KayahLi => Volatile.Read(ref _kayahLi) ?? CreateRange(ref _kayahLi, first: '\uA900', last: '\uA92F');
- private static UnicodeRange _kayahLi;
-
- ///
- /// A corresponding to the 'Rejang' Unicode block (U+A930..U+A95F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/UA930.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Rejang => Volatile.Read(ref _rejang) ?? CreateRange(ref _rejang, first: '\uA930', last: '\uA95F');
- private static UnicodeRange _rejang;
-
- ///
- /// A corresponding to the 'Hangul Jamo Extended-A' Unicode block (U+A960..U+A97F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/UA960.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange HangulJamoExtendedA => Volatile.Read(ref _hangulJamoExtendedA) ?? CreateRange(ref _hangulJamoExtendedA, first: '\uA960', last: '\uA97F');
- private static UnicodeRange _hangulJamoExtendedA;
-
- ///
- /// A corresponding to the 'Javanese' Unicode block (U+A980..U+A9DF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/UA980.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Javanese => Volatile.Read(ref _javanese) ?? CreateRange(ref _javanese, first: '\uA980', last: '\uA9DF');
- private static UnicodeRange _javanese;
-
- ///
- /// A corresponding to the 'Myanmar Extended-B' Unicode block (U+A9E0..U+A9FF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/UA9E0.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange MyanmarExtendedB => Volatile.Read(ref _myanmarExtendedB) ?? CreateRange(ref _myanmarExtendedB, first: '\uA9E0', last: '\uA9FF');
- private static UnicodeRange _myanmarExtendedB;
-
- ///
- /// A corresponding to the 'Cham' Unicode block (U+AA00..U+AA5F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/UAA00.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Cham => Volatile.Read(ref _cham) ?? CreateRange(ref _cham, first: '\uAA00', last: '\uAA5F');
- private static UnicodeRange _cham;
-
- ///
- /// A corresponding to the 'Myanmar Extended-A' Unicode block (U+AA60..U+AA7F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/UAA60.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange MyanmarExtendedA => Volatile.Read(ref _myanmarExtendedA) ?? CreateRange(ref _myanmarExtendedA, first: '\uAA60', last: '\uAA7F');
- private static UnicodeRange _myanmarExtendedA;
-
- ///
- /// A corresponding to the 'Tai Viet' Unicode block (U+AA80..U+AADF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/UAA80.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange TaiViet => Volatile.Read(ref _taiViet) ?? CreateRange(ref _taiViet, first: '\uAA80', last: '\uAADF');
- private static UnicodeRange _taiViet;
-
- ///
- /// A corresponding to the 'Meetei Mayek Extensions' Unicode block (U+AAE0..U+AAFF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/UAAE0.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange MeeteiMayekExtensions => Volatile.Read(ref _meeteiMayekExtensions) ?? CreateRange(ref _meeteiMayekExtensions, first: '\uAAE0', last: '\uAAFF');
- private static UnicodeRange _meeteiMayekExtensions;
-
- ///
- /// A corresponding to the 'Ethiopic Extended-A' Unicode block (U+AB00..U+AB2F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/UAB00.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange EthiopicExtendedA => Volatile.Read(ref _ethiopicExtendedA) ?? CreateRange(ref _ethiopicExtendedA, first: '\uAB00', last: '\uAB2F');
- private static UnicodeRange _ethiopicExtendedA;
-
- ///
- /// A corresponding to the 'Latin Extended-E' Unicode block (U+AB30..U+AB6F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/UAB30.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange LatinExtendedE => Volatile.Read(ref _latinExtendedE) ?? CreateRange(ref _latinExtendedE, first: '\uAB30', last: '\uAB6F');
- private static UnicodeRange _latinExtendedE;
-
- ///
- /// A corresponding to the 'Cherokee Supplement' Unicode block (U+AB70..U+ABBF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/UAB70.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange CherokeeSupplement => Volatile.Read(ref _cherokeeSupplement) ?? CreateRange(ref _cherokeeSupplement, first: '\uAB70', last: '\uABBF');
- private static UnicodeRange _cherokeeSupplement;
-
- ///
- /// A corresponding to the 'Meetei Mayek' Unicode block (U+ABC0..U+ABFF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/UABC0.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange MeeteiMayek => Volatile.Read(ref _meeteiMayek) ?? CreateRange(ref _meeteiMayek, first: '\uABC0', last: '\uABFF');
- private static UnicodeRange _meeteiMayek;
-
- ///
- /// A corresponding to the 'Hangul Syllables' Unicode block (U+AC00..U+D7AF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/UAC00.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange HangulSyllables => Volatile.Read(ref _hangulSyllables) ?? CreateRange(ref _hangulSyllables, first: '\uAC00', last: '\uD7AF');
- private static UnicodeRange _hangulSyllables;
-
- ///
- /// A corresponding to the 'Hangul Jamo Extended-B' Unicode block (U+D7B0..U+D7FF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/UD7B0.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange HangulJamoExtendedB => Volatile.Read(ref _hangulJamoExtendedB) ?? CreateRange(ref _hangulJamoExtendedB, first: '\uD7B0', last: '\uD7FF');
- private static UnicodeRange _hangulJamoExtendedB;
-
- ///
- /// A corresponding to the 'CJK Compatibility Ideographs' Unicode block (U+F900..U+FAFF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/UF900.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange CJKCompatibilityIdeographs => Volatile.Read(ref _cjkCompatibilityIdeographs) ?? CreateRange(ref _cjkCompatibilityIdeographs, first: '\uF900', last: '\uFAFF');
- private static UnicodeRange _cjkCompatibilityIdeographs;
-
- ///
- /// A corresponding to the 'Alphabetic Presentation Forms' Unicode block (U+FB00..U+FB4F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/UFB00.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange AlphabeticPresentationForms => Volatile.Read(ref _alphabeticPresentationForms) ?? CreateRange(ref _alphabeticPresentationForms, first: '\uFB00', last: '\uFB4F');
- private static UnicodeRange _alphabeticPresentationForms;
-
- ///
- /// A corresponding to the 'Arabic Presentation Forms-A' Unicode block (U+FB50..U+FDFF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/UFB50.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange ArabicPresentationFormsA => Volatile.Read(ref _arabicPresentationFormsA) ?? CreateRange(ref _arabicPresentationFormsA, first: '\uFB50', last: '\uFDFF');
- private static UnicodeRange _arabicPresentationFormsA;
-
- ///
- /// A corresponding to the 'Variation Selectors' Unicode block (U+FE00..U+FE0F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/UFE00.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange VariationSelectors => Volatile.Read(ref _variationSelectors) ?? CreateRange(ref _variationSelectors, first: '\uFE00', last: '\uFE0F');
- private static UnicodeRange _variationSelectors;
-
- ///
- /// A corresponding to the 'Vertical Forms' Unicode block (U+FE10..U+FE1F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/UFE10.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange VerticalForms => Volatile.Read(ref _verticalForms) ?? CreateRange(ref _verticalForms, first: '\uFE10', last: '\uFE1F');
- private static UnicodeRange _verticalForms;
-
- ///
- /// A corresponding to the 'Combining Half Marks' Unicode block (U+FE20..U+FE2F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/UFE20.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange CombiningHalfMarks => Volatile.Read(ref _combiningHalfMarks) ?? CreateRange(ref _combiningHalfMarks, first: '\uFE20', last: '\uFE2F');
- private static UnicodeRange _combiningHalfMarks;
-
- ///
- /// A corresponding to the 'CJK Compatibility Forms' Unicode block (U+FE30..U+FE4F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/UFE30.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange CJKCompatibilityForms => Volatile.Read(ref _cjkCompatibilityForms) ?? CreateRange(ref _cjkCompatibilityForms, first: '\uFE30', last: '\uFE4F');
- private static UnicodeRange _cjkCompatibilityForms;
-
- ///
- /// A corresponding to the 'Small Form Variants' Unicode block (U+FE50..U+FE6F).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/UFE50.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange SmallFormVariants => Volatile.Read(ref _smallFormVariants) ?? CreateRange(ref _smallFormVariants, first: '\uFE50', last: '\uFE6F');
- private static UnicodeRange _smallFormVariants;
-
- ///
- /// A corresponding to the 'Arabic Presentation Forms-B' Unicode block (U+FE70..U+FEFF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/UFE70.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange ArabicPresentationFormsB => Volatile.Read(ref _arabicPresentationFormsB) ?? CreateRange(ref _arabicPresentationFormsB, first: '\uFE70', last: '\uFEFF');
- private static UnicodeRange _arabicPresentationFormsB;
-
- ///
- /// A corresponding to the 'Halfwidth and Fullwidth Forms' Unicode block (U+FF00..U+FFEF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/UFF00.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange HalfwidthandFullwidthForms => Volatile.Read(ref _halfwidthandFullwidthForms) ?? CreateRange(ref _halfwidthandFullwidthForms, first: '\uFF00', last: '\uFFEF');
- private static UnicodeRange _halfwidthandFullwidthForms;
-
- ///
- /// A corresponding to the 'Specials' Unicode block (U+FFF0..U+FFFF).
- ///
- ///
- /// See http://www.unicode.org/charts/PDF/UFFF0.pdf for the full set of characters in this block.
- ///
- public static UnicodeRange Specials => Volatile.Read(ref _specials) ?? CreateRange(ref _specials, first: '\uFFF0', last: '\uFFFF');
- private static UnicodeRange _specials;
- }
-}
diff --git a/src/Microsoft.Extensions.WebEncoders.Core/UrlEncoder.cs b/src/Microsoft.Extensions.WebEncoders.Core/UrlEncoder.cs
deleted file mode 100644
index f5d6ea1c99..0000000000
--- a/src/Microsoft.Extensions.WebEncoders.Core/UrlEncoder.cs
+++ /dev/null
@@ -1,245 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-using System.Diagnostics;
-using System.IO;
-using System.Runtime.CompilerServices;
-using System.Threading;
-
-namespace Microsoft.Extensions.WebEncoders
-{
- ///
- /// A class which can perform URL string escaping given an allow list of characters which
- /// can be represented unescaped.
- ///
- ///
- /// Instances of this type will always encode a certain set of characters (such as +
- /// and ?), even if the filter provided in the constructor allows such characters.
- /// Once constructed, instances of this class are thread-safe for multiple callers.
- ///
- public sealed class UrlEncoder : IUrlEncoder
- {
- // The default URL string encoder (Basic Latin), instantiated on demand
- private static UrlEncoder _defaultEncoder;
-
- // The inner encoder, responsible for the actual encoding routines
- private readonly UrlUnicodeEncoder _innerUnicodeEncoder;
-
- ///
- /// Instantiates an encoder using as its allow list.
- /// Any character not in the range will be escaped.
- ///
- public UrlEncoder()
- : this(UrlUnicodeEncoder.BasicLatin)
- {
- }
-
- ///
- /// Instantiates an encoder specifying which Unicode character ranges are allowed to
- /// pass through the encoder unescaped. Any character not in the set of ranges specified
- /// by will be escaped.
- ///
- public UrlEncoder(params UnicodeRange[] allowedRanges)
- : this(new UrlUnicodeEncoder(new CodePointFilter(allowedRanges)))
- {
- }
-
- ///
- /// Instantiates an encoder using a custom code point filter. Any character not in the
- /// set returned by 's
- /// method will be escaped.
- ///
- public UrlEncoder(ICodePointFilter filter)
- : this(new UrlUnicodeEncoder(CodePointFilter.Wrap(filter)))
- {
- if (filter == null)
- {
- throw new ArgumentNullException(nameof(filter));
- }
- }
-
- private UrlEncoder(UrlUnicodeEncoder innerEncoder)
- {
- Debug.Assert(innerEncoder != null);
- _innerUnicodeEncoder = innerEncoder;
- }
-
- ///
- /// A default instance of .
- ///
- ///
- /// This normally corresponds to . However, this property is
- /// settable so that a developer can change the default implementation application-wide.
- ///
- public static UrlEncoder Default
- {
- get
- {
- return Volatile.Read(ref _defaultEncoder) ?? CreateDefaultEncoderSlow();
- }
- set
- {
- if (value == null)
- {
- throw new ArgumentNullException(nameof(value));
- }
- Volatile.Write(ref _defaultEncoder, value);
- }
- }
-
- [MethodImpl(MethodImplOptions.NoInlining)] // the JITter can attempt to inline the caller itself without worrying about us
- private static UrlEncoder CreateDefaultEncoderSlow()
- {
- var onDemandEncoder = new UrlEncoder();
- return Interlocked.CompareExchange(ref _defaultEncoder, onDemandEncoder, null) ?? onDemandEncoder;
- }
-
- ///
- /// Everybody's favorite UrlEncode routine.
- ///
- public void UrlEncode(char[] value, int startIndex, int charCount, TextWriter output)
- {
- if (value == null)
- {
- throw new ArgumentNullException(nameof(value));
- }
-
- if (output == null)
- {
- throw new ArgumentNullException(nameof(output));
- }
-
- _innerUnicodeEncoder.Encode(value, startIndex, charCount, output);
- }
-
- ///
- /// Everybody's favorite UrlEncode routine.
- ///
- public string UrlEncode(string value)
- {
- return _innerUnicodeEncoder.Encode(value);
- }
-
- ///
- /// Everybody's favorite UrlEncode routine.
- ///
- public void UrlEncode(string value, int startIndex, int charCount, TextWriter output)
- {
- if (value == null)
- {
- throw new ArgumentNullException(nameof(value));
- }
-
- if (output == null)
- {
- throw new ArgumentNullException(nameof(output));
- }
-
- _innerUnicodeEncoder.Encode(value, startIndex, charCount, output);
- }
-
- private sealed class UrlUnicodeEncoder : UnicodeEncoderBase
- {
- // A singleton instance of the basic latin encoder.
- private static UrlUnicodeEncoder _basicLatinSingleton;
-
- // We perform UTF8 conversion of input, which means that the worst case is
- // 9 output chars per input char: [input] U+FFFF -> [output] "%XX%YY%ZZ".
- // We don't need to worry about astral code points since they consume 2 input
- // chars to produce 12 output chars "%XX%YY%ZZ%WW", which is 6 output chars per input char.
- private const int MaxOutputCharsPerInputChar = 9;
-
- internal UrlUnicodeEncoder(CodePointFilter filter)
- : base(filter, MaxOutputCharsPerInputChar)
- {
- // Per RFC 3987, Sec. 2.2, we want encodings that are safe for
- // four particular components: 'isegment', 'ipath-noscheme',
- // 'iquery', and 'ifragment'. The relevant definitions are below.
- //
- // ipath-noscheme = isegment-nz-nc *( "/" isegment )
- //
- // isegment = *ipchar
- //
- // isegment-nz-nc = 1*( iunreserved / pct-encoded / sub-delims
- // / "@" )
- // ; non-zero-length segment without any colon ":"
- //
- // ipchar = iunreserved / pct-encoded / sub-delims / ":"
- // / "@"
- //
- // iquery = *( ipchar / iprivate / "/" / "?" )
- //
- // ifragment = *( ipchar / "/" / "?" )
- //
- // iunreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" / ucschar
- //
- // ucschar = %xA0-D7FF / %xF900-FDCF / %xFDF0-FFEF
- // / %x10000-1FFFD / %x20000-2FFFD / %x30000-3FFFD
- // / %x40000-4FFFD / %x50000-5FFFD / %x60000-6FFFD
- // / %x70000-7FFFD / %x80000-8FFFD / %x90000-9FFFD
- // / %xA0000-AFFFD / %xB0000-BFFFD / %xC0000-CFFFD
- // / %xD0000-DFFFD / %xE1000-EFFFD
- //
- // pct-encoded = "%" HEXDIG HEXDIG
- //
- // sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
- // / "*" / "+" / "," / ";" / "="
- //
- // The only common characters between these four components are the
- // intersection of 'isegment-nz-nc' and 'ipchar', which is really
- // just 'isegment-nz-nc' (colons forbidden).
- //
- // From this list, the base encoder already forbids "&", "'", "+",
- // and we'll additionally forbid "=" since it has special meaning
- // in x-www-form-urlencoded representations.
- //
- // This means that the full list of allowed characters from the
- // Basic Latin set is:
- // ALPHA / DIGIT / "-" / "." / "_" / "~" / "!" / "$" / "(" / ")" / "*" / "," / ";" / "@"
-
- const string forbiddenChars = @" #%/:=?[\]^`{|}"; // chars from Basic Latin which aren't already disallowed by the base encoder
- foreach (char c in forbiddenChars)
- {
- ForbidCharacter(c);
- }
-
- // Specials (U+FFF0 .. U+FFFF) are forbidden by the definition of 'ucschar' above
- for (int i = 0; i < 16; i++)
- {
- ForbidCharacter((char)(0xFFF0 | i));
- }
-
- // Supplementary characters are forbidden anyway by the base encoder
- }
-
- internal static UrlUnicodeEncoder BasicLatin
- {
- get
- {
- UrlUnicodeEncoder encoder = Volatile.Read(ref _basicLatinSingleton);
- if (encoder == null)
- {
- encoder = new UrlUnicodeEncoder(new CodePointFilter(UnicodeRanges.BasicLatin));
- Volatile.Write(ref _basicLatinSingleton, encoder);
- }
- return encoder;
- }
- }
-
- // Writes a scalar value as a percent-encoded sequence of UTF8 bytes, per RFC 3987.
- protected override void WriteEncodedScalar(ref Writer writer, uint value)
- {
- uint asUtf8 = (uint)UnicodeHelpers.GetUtf8RepresentationForScalarValue(value);
- do
- {
- char highNibble, lowNibble;
- HexUtil.WriteHexEncodedByte((byte)asUtf8, out highNibble, out lowNibble);
- writer.Write('%');
- writer.Write(highNibble);
- writer.Write(lowNibble);
- } while ((asUtf8 >>= 8) != 0);
- }
- }
- }
-}
diff --git a/src/Microsoft.Extensions.WebEncoders.Core/compiler/resources/unicode-defined-chars.bin b/src/Microsoft.Extensions.WebEncoders.Core/compiler/resources/unicode-defined-chars.bin
deleted file mode 100644
index 48fa163f08..0000000000
Binary files a/src/Microsoft.Extensions.WebEncoders.Core/compiler/resources/unicode-defined-chars.bin and /dev/null differ
diff --git a/src/Microsoft.Extensions.WebEncoders.Core/project.json b/src/Microsoft.Extensions.WebEncoders.Core/project.json
deleted file mode 100644
index 990b9a373b..0000000000
--- a/src/Microsoft.Extensions.WebEncoders.Core/project.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
- "version": "1.0.0-*",
- "description": "Contains core encoders for HTML, JavaScript strings, and URLs.",
- "repository": {
- "type": "git",
- "url": "git://github.com/aspnet/httpabstractions"
- },
- "compilationOptions": {
- "allowUnsafe": true,
- "warningsAsErrors": true
- },
- "frameworks": {
- "net451": {},
- "dotnet5.4": {
- "dependencies": {
- "System.ComponentModel": "4.0.1-beta-*",
- "System.Diagnostics.Debug": "4.0.11-beta-*",
- "System.IO": "4.0.11-beta-*",
- "System.Reflection": "4.0.10-*",
- "System.Resources.ResourceManager": "4.0.1-beta-*",
- "System.Runtime.Extensions": "4.0.11-beta-*",
- "System.Threading": "4.0.11-beta-*"
- }
- }
- }
-}
\ No newline at end of file
diff --git a/src/Microsoft.Extensions.WebEncoders/EncoderServiceCollectionExtensions.cs b/src/Microsoft.Extensions.WebEncoders/EncoderServiceCollectionExtensions.cs
index 0cb40d8a62..c2327d330d 100644
--- a/src/Microsoft.Extensions.WebEncoders/EncoderServiceCollectionExtensions.cs
+++ b/src/Microsoft.Extensions.WebEncoders/EncoderServiceCollectionExtensions.cs
@@ -2,6 +2,7 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
+using System.Text.Encodings.Web;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.OptionsModel;
using Microsoft.Extensions.WebEncoders;
@@ -31,12 +32,12 @@ namespace Microsoft.Extensions.DependencyInjection
// Register the default encoders
// We want to call the 'Default' property getters lazily since they perform static caching
- services.TryAdd(ServiceDescriptor.Singleton(
- CreateFactory(() => HtmlEncoder.Default, filter => new HtmlEncoder(filter))));
- services.TryAdd(ServiceDescriptor.Singleton(
- CreateFactory(() => JavaScriptStringEncoder.Default, filter => new JavaScriptStringEncoder(filter))));
- services.TryAdd(ServiceDescriptor.Singleton(
- CreateFactory(() => UrlEncoder.Default, filter => new UrlEncoder(filter))));
+ services.TryAdd(ServiceDescriptor.Singleton(
+ CreateFactory(() => HtmlEncoder.Default, settings => HtmlEncoder.Create(settings))));
+ services.TryAdd(ServiceDescriptor.Singleton(
+ CreateFactory(() => JavaScriptEncoder.Default, settings => JavaScriptEncoder.Create(settings))));
+ services.TryAdd(ServiceDescriptor.Singleton(
+ CreateFactory(() => UrlEncoder.Default, settings => UrlEncoder.Create(settings))));
if (configureOptions != null)
{
@@ -48,14 +49,14 @@ namespace Microsoft.Extensions.DependencyInjection
private static Func CreateFactory(
Func defaultFactory,
- Func customFilterFactory)
+ Func customSettingsFactory)
{
return serviceProvider =>
{
- var codePointFilter = serviceProvider?.GetService>()?
+ var settings = serviceProvider?.GetService>()?
.Value?
- .CodePointFilter;
- return (codePointFilter != null) ? customFilterFactory(codePointFilter) : defaultFactory();
+ .TextEncoderSettings;
+ return (settings != null) ? customSettingsFactory(settings) : defaultFactory();
};
}
}
diff --git a/src/Microsoft.Extensions.WebEncoders.Core/EncoderServiceProviderExtensions.cs b/src/Microsoft.Extensions.WebEncoders/EncoderServiceProviderExtensions.cs
similarity index 59%
rename from src/Microsoft.Extensions.WebEncoders.Core/EncoderServiceProviderExtensions.cs
rename to src/Microsoft.Extensions.WebEncoders/EncoderServiceProviderExtensions.cs
index f08f37db52..8d9d2da4e8 100644
--- a/src/Microsoft.Extensions.WebEncoders.Core/EncoderServiceProviderExtensions.cs
+++ b/src/Microsoft.Extensions.WebEncoders/EncoderServiceProviderExtensions.cs
@@ -2,6 +2,7 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
+using System.Text.Encodings.Web;
namespace Microsoft.Extensions.WebEncoders
{
@@ -11,39 +12,39 @@ namespace Microsoft.Extensions.WebEncoders
public static class EncoderServiceProviderExtensions
{
///
- /// Retrieves an from an .
+ /// Retrieves an from an .
///
///
/// This method is guaranteed never to return null.
/// It will return a default encoder instance if does not contain one or is null.
///
- public static IHtmlEncoder GetHtmlEncoder(this IServiceProvider serviceProvider)
+ public static HtmlEncoder GetHtmlEncoder(this IServiceProvider serviceProvider)
{
- return (IHtmlEncoder)serviceProvider?.GetService(typeof(IHtmlEncoder)) ?? HtmlEncoder.Default;
+ return (HtmlEncoder)serviceProvider?.GetService(typeof(HtmlEncoder)) ?? HtmlEncoder.Default;
}
///
- /// Retrieves an from an .
+ /// Retrieves an from an .
///
///
/// This method is guaranteed never to return null.
/// It will return a default encoder instance if does not contain one or is null.
///
- public static IJavaScriptStringEncoder GetJavaScriptStringEncoder(this IServiceProvider serviceProvider)
+ public static JavaScriptEncoder GetJavaScriptEncoder(this IServiceProvider serviceProvider)
{
- return (IJavaScriptStringEncoder)serviceProvider?.GetService(typeof(IJavaScriptStringEncoder)) ?? JavaScriptStringEncoder.Default;
+ return (JavaScriptEncoder)serviceProvider?.GetService(typeof(JavaScriptEncoder)) ?? JavaScriptEncoder.Default;
}
///
- /// Retrieves an from an .
+ /// Retrieves an from an .
///
///
/// This method is guaranteed never to return null.
/// It will return a default encoder instance if does not contain one or is null.
///
- public static IUrlEncoder GetUrlEncoder(this IServiceProvider serviceProvider)
+ public static UrlEncoder GetUrlEncoder(this IServiceProvider serviceProvider)
{
- return (IUrlEncoder)serviceProvider?.GetService(typeof(IUrlEncoder)) ?? UrlEncoder.Default;
+ return (UrlEncoder)serviceProvider?.GetService(typeof(UrlEncoder)) ?? UrlEncoder.Default;
}
}
}
diff --git a/src/Microsoft.Extensions.WebEncoders/Testing/HtmlTestEncoder.cs b/src/Microsoft.Extensions.WebEncoders/Testing/HtmlTestEncoder.cs
new file mode 100644
index 0000000000..7768d65bfa
--- /dev/null
+++ b/src/Microsoft.Extensions.WebEncoders/Testing/HtmlTestEncoder.cs
@@ -0,0 +1,54 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System.IO;
+using System.Text.Encodings.Web;
+
+namespace Microsoft.Extensions.WebEncoders.Testing
+{
+ ///
+ /// Encoder used for unit testing.
+ ///
+ public sealed class HtmlTestEncoder : HtmlEncoder
+ {
+ public override int MaxOutputCharactersPerInputCharacter
+ {
+ get { return 1; }
+ }
+
+ public override string Encode(string value)
+ {
+ return $"HtmlEncode[[{value}]]";
+ }
+
+ public override void Encode(TextWriter output, char[] value, int startIndex, int characterCount)
+ {
+ output.Write("HtmlEncode[[");
+ output.Write(value, startIndex, characterCount);
+ output.Write("]]");
+ }
+
+ public override void Encode(TextWriter output, string value, int startIndex, int characterCount)
+ {
+ output.Write("HtmlEncode[[");
+ output.Write(value.Substring(startIndex, characterCount));
+ output.Write("]]");
+ }
+
+ public override bool WillEncode(int unicodeScalar)
+ {
+ return false;
+ }
+
+ public override unsafe int FindFirstCharacterToEncode(char* text, int textLength)
+ {
+ return -1;
+ }
+
+ public override unsafe bool TryEncodeUnicodeScalar(int unicodeScalar, char* buffer, int bufferLength, out int numberOfCharactersWritten)
+ {
+ numberOfCharactersWritten = 0;
+ return false;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Microsoft.Extensions.WebEncoders/Testing/JavaScriptTestEncoder.cs b/src/Microsoft.Extensions.WebEncoders/Testing/JavaScriptTestEncoder.cs
new file mode 100644
index 0000000000..4207e8a43f
--- /dev/null
+++ b/src/Microsoft.Extensions.WebEncoders/Testing/JavaScriptTestEncoder.cs
@@ -0,0 +1,54 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System.IO;
+using System.Text.Encodings.Web;
+
+namespace Microsoft.Extensions.WebEncoders.Testing
+{
+ ///
+ /// Encoder used for unit testing.
+ ///
+ public class JavaScriptTestEncoder : JavaScriptEncoder
+ {
+ public override int MaxOutputCharactersPerInputCharacter
+ {
+ get { return 1; }
+ }
+
+ public override string Encode(string value)
+ {
+ return $"JavaScriptEncode[[{value}]]";
+ }
+
+ public override void Encode(TextWriter output, char[] value, int startIndex, int characterCount)
+ {
+ output.Write("JavaScriptEncode[[");
+ output.Write(value, startIndex, characterCount);
+ output.Write("]]");
+ }
+
+ public override void Encode(TextWriter output, string value, int startIndex, int characterCount)
+ {
+ output.Write("JavaScriptEncode[[");
+ output.Write(value.Substring(startIndex, characterCount));
+ output.Write("]]");
+ }
+
+ public override bool WillEncode(int unicodeScalar)
+ {
+ return false;
+ }
+
+ public override unsafe int FindFirstCharacterToEncode(char* text, int textLength)
+ {
+ return -1;
+ }
+
+ public override unsafe bool TryEncodeUnicodeScalar(int unicodeScalar, char* buffer, int bufferLength, out int numberOfCharactersWritten)
+ {
+ numberOfCharactersWritten = 0;
+ return false;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Microsoft.Extensions.WebEncoders/Testing/UrlTestEncoder.cs b/src/Microsoft.Extensions.WebEncoders/Testing/UrlTestEncoder.cs
new file mode 100644
index 0000000000..d10ee75594
--- /dev/null
+++ b/src/Microsoft.Extensions.WebEncoders/Testing/UrlTestEncoder.cs
@@ -0,0 +1,54 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System.IO;
+using System.Text.Encodings.Web;
+
+namespace Microsoft.Extensions.WebEncoders.Testing
+{
+ ///
+ /// Encoder used for unit testing.
+ ///
+ public class UrlTestEncoder : UrlEncoder
+ {
+ public override int MaxOutputCharactersPerInputCharacter
+ {
+ get { return 1; }
+ }
+
+ public override string Encode(string value)
+ {
+ return $"UrlEncode[[{value}]]";
+ }
+
+ public override void Encode(TextWriter output, char[] value, int startIndex, int characterCount)
+ {
+ output.Write("UrlEncode[[");
+ output.Write(value, startIndex, characterCount);
+ output.Write("]]");
+ }
+
+ public override void Encode(TextWriter output, string value, int startIndex, int characterCount)
+ {
+ output.Write("UrlEncode[[");
+ output.Write(value.Substring(startIndex, characterCount));
+ output.Write("]]");
+ }
+
+ public override bool WillEncode(int unicodeScalar)
+ {
+ return false;
+ }
+
+ public override unsafe int FindFirstCharacterToEncode(char* text, int textLength)
+ {
+ return -1;
+ }
+
+ public override unsafe bool TryEncodeUnicodeScalar(int unicodeScalar, char* buffer, int bufferLength, out int numberOfCharactersWritten)
+ {
+ numberOfCharactersWritten = 0;
+ return false;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Microsoft.Extensions.WebEncoders.Core/WebEncoderOptions.cs b/src/Microsoft.Extensions.WebEncoders/WebEncoderOptions.cs
similarity index 82%
rename from src/Microsoft.Extensions.WebEncoders.Core/WebEncoderOptions.cs
rename to src/Microsoft.Extensions.WebEncoders/WebEncoderOptions.cs
index b68b05ee50..2f5e770a0c 100644
--- a/src/Microsoft.Extensions.WebEncoders.Core/WebEncoderOptions.cs
+++ b/src/Microsoft.Extensions.WebEncoders/WebEncoderOptions.cs
@@ -1,12 +1,12 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-using System;
+using System.Text.Encodings.Web;
namespace Microsoft.Extensions.WebEncoders
{
///
- /// Specifies options common to all three encoders (HtmlEncode, JavaScriptStringEncode, UrlEncode).
+ /// Specifies options common to all three encoders (HtmlEncode, JavaScriptEncode, UrlEncode).
///
public sealed class WebEncoderOptions
{
@@ -16,6 +16,6 @@ namespace Microsoft.Extensions.WebEncoders
///
/// If this property is null, then the encoders will use their default allow lists.
///
- public ICodePointFilter CodePointFilter { get; set; }
+ public TextEncoderSettings TextEncoderSettings { get; set; }
}
}
diff --git a/src/Microsoft.Extensions.WebEncoders/project.json b/src/Microsoft.Extensions.WebEncoders/project.json
index ecc7c0a3d1..c92247832b 100644
--- a/src/Microsoft.Extensions.WebEncoders/project.json
+++ b/src/Microsoft.Extensions.WebEncoders/project.json
@@ -6,15 +6,21 @@
"url": "git://github.com/aspnet/httpabstractions"
},
"compilationOptions": {
- "warningsAsErrors": true
+ "warningsAsErrors": true,
+ "allowUnsafe": true
},
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "1.0.0-*",
"Microsoft.Extensions.OptionsModel": "1.0.0-*",
- "Microsoft.Extensions.WebEncoders.Core": "1.0.0-*"
+ "System.Text.Encodings.Web": "4.0.0-beta-*"
},
"frameworks": {
- "net451": {},
+ "net451": {
+ "frameworkAssemblies": {
+ "System.IO": "",
+ "System.Runtime": ""
+ }
+ },
"dotnet5.4": {}
}
}
\ No newline at end of file
diff --git a/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs
index 8221fa524c..1641f92caf 100644
--- a/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs
+++ b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs
@@ -5,8 +5,9 @@ using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
+using System.Text.Encodings.Web;
using Microsoft.AspNet.Testing;
-using Microsoft.Extensions.WebEncoders;
+using Microsoft.Extensions.WebEncoders.Testing;
using Xunit;
namespace Microsoft.AspNet.Html.Abstractions.Test
@@ -345,7 +346,7 @@ namespace Microsoft.AspNet.Html.Abstractions.Test
{
using (var writer = new StringWriter())
{
- content.WriteTo(writer, new CommonTestEncoder());
+ content.WriteTo(writer, new HtmlTestEncoder());
return writer.ToString();
}
}
@@ -378,7 +379,7 @@ namespace Microsoft.AspNet.Html.Abstractions.Test
return this;
}
- public void WriteTo(TextWriter writer, IHtmlEncoder encoder)
+ public void WriteTo(TextWriter writer, HtmlEncoder encoder)
{
foreach (var entry in Entries)
{
@@ -396,7 +397,7 @@ namespace Microsoft.AspNet.Html.Abstractions.Test
public string Value { get; }
- public void WriteTo(TextWriter writer, IHtmlEncoder encoder)
+ public void WriteTo(TextWriter writer, HtmlEncoder encoder)
{
writer.Write(Value);
}
@@ -411,9 +412,9 @@ namespace Microsoft.AspNet.Html.Abstractions.Test
public string Value { get; }
- public void WriteTo(TextWriter writer, IHtmlEncoder encoder)
+ public void WriteTo(TextWriter writer, HtmlEncoder encoder)
{
- encoder.HtmlEncode(Value, writer);
+ encoder.Encode(writer, Value);
}
}
@@ -426,7 +427,7 @@ namespace Microsoft.AspNet.Html.Abstractions.Test
public string Value { get; }
- public void WriteTo(TextWriter writer, IHtmlEncoder encoder)
+ public void WriteTo(TextWriter writer, HtmlEncoder encoder)
{
throw new NotImplementedException();
}
diff --git a/test/Microsoft.AspNet.Html.Abstractions.Test/project.json b/test/Microsoft.AspNet.Html.Abstractions.Test/project.json
index 789d27a38d..06a8d06a2c 100644
--- a/test/Microsoft.AspNet.Html.Abstractions.Test/project.json
+++ b/test/Microsoft.AspNet.Html.Abstractions.Test/project.json
@@ -2,9 +2,9 @@
"dependencies": {
"Microsoft.AspNet.Html.Abstractions": "1.0.0-*",
"Microsoft.AspNet.Testing": "1.0.0-*",
+ "Microsoft.Extensions.WebEncoders": "1.0.0-*",
"xunit.runner.aspnet": "2.0.0-aspnet-*"
},
- "compile": [ "../Microsoft.Extensions.WebEncoders.Tests/CommonTestEncoder.cs" ],
"commands": {
"test": "xunit.runner.aspnet"
},
diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/QueryStringTests.cs b/test/Microsoft.AspNet.Http.Abstractions.Tests/QueryStringTests.cs
index f36b8eeefc..3084aec482 100644
--- a/test/Microsoft.AspNet.Http.Abstractions.Tests/QueryStringTests.cs
+++ b/test/Microsoft.AspNet.Http.Abstractions.Tests/QueryStringTests.cs
@@ -56,7 +56,6 @@ namespace Microsoft.AspNet.Http.Abstractions
[InlineData("name", "", "?name=")]
[InlineData("", "value", "?=value")]
[InlineData("", "", "?=")]
- [InlineData(null, null, "?=")]
public void CreateNameValue_Success(string name, string value, string exepcted)
{
var query = QueryString.Create(name, value);
@@ -94,7 +93,6 @@ namespace Microsoft.AspNet.Http.Abstractions
}
[Theory]
- [InlineData(null, null, null, "?=")]
[InlineData("", "", "", "?=")]
[InlineData("?", "", "", "?=")]
[InlineData("?", "name2", "value2", "?name2=value2")]
diff --git a/test/Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs b/test/Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs
index 2eebd6041e..f65cb4eaaf 100644
--- a/test/Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs
+++ b/test/Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs
@@ -2,8 +2,9 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.IO;
+using System.Text.Encodings.Web;
using Microsoft.AspNet.Html.Abstractions;
-using Microsoft.Extensions.WebEncoders;
+using Microsoft.Extensions.WebEncoders.Testing;
using Xunit;
namespace Microsoft.Extensions.Internal
@@ -34,7 +35,7 @@ namespace Microsoft.Extensions.Internal
var writer = new StringWriter();
// Act
- content.WriteTo(writer, new CommonTestEncoder());
+ content.WriteTo(writer, new HtmlTestEncoder());
// Assert
Assert.Equal("HtmlEncode[[Hello]]", writer.ToString());
@@ -50,7 +51,7 @@ namespace Microsoft.Extensions.Internal
var writer = new StringWriter();
// Act
- content.WriteTo(writer, new CommonTestEncoder());
+ content.WriteTo(writer, new HtmlTestEncoder());
// Assert
Assert.Equal("Hello", writer.ToString());
@@ -69,7 +70,7 @@ namespace Microsoft.Extensions.Internal
// Assert
var result = Assert.Single(content.Entries);
var testHtmlContent = Assert.IsType(result);
- testHtmlContent.WriteTo(writer, new CommonTestEncoder());
+ testHtmlContent.WriteTo(writer, new HtmlTestEncoder());
Assert.Equal("Written from TestHtmlContent: Hello", writer.ToString());
}
@@ -114,7 +115,7 @@ namespace Microsoft.Extensions.Internal
content.Append("Test");
// Act
- content.WriteTo(writer, new CommonTestEncoder());
+ content.WriteTo(writer, new HtmlTestEncoder());
// Assert
Assert.Equal(2, content.Entries.Count);
@@ -130,7 +131,7 @@ namespace Microsoft.Extensions.Internal
_content = content;
}
- public void WriteTo(TextWriter writer, IHtmlEncoder encoder)
+ public void WriteTo(TextWriter writer, HtmlEncoder encoder)
{
writer.Write(ToString());
}
diff --git a/test/Microsoft.Extensions.BufferedHtmlContent.Test/project.json b/test/Microsoft.Extensions.BufferedHtmlContent.Test/project.json
index 0f4d9b84b3..8ed950043b 100644
--- a/test/Microsoft.Extensions.BufferedHtmlContent.Test/project.json
+++ b/test/Microsoft.Extensions.BufferedHtmlContent.Test/project.json
@@ -4,10 +4,13 @@
},
"dependencies": {
"Microsoft.AspNet.Html.Abstractions": "1.0.0-*",
- "Microsoft.Extensions.BufferedHtmlContent.Sources": { "type": "build", "version": "1.0.0-*" },
+ "Microsoft.Extensions.BufferedHtmlContent.Sources": {
+ "type": "build",
+ "version": "1.0.0-*"
+ },
+ "Microsoft.Extensions.WebEncoders.Tests" : "1.0.0-*",
"xunit.runner.aspnet": "2.0.0-aspnet-*"
},
- "compile": [ "../Microsoft.Extensions.WebEncoders.Tests/CommonTestEncoder.cs" ],
"commands": {
"test": "xunit.runner.aspnet"
},
diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/AllowedCharsBitmapTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/AllowedCharsBitmapTests.cs
deleted file mode 100644
index 24cdb75568..0000000000
--- a/test/Microsoft.Extensions.WebEncoders.Tests/AllowedCharsBitmapTests.cs
+++ /dev/null
@@ -1,125 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-using Xunit;
-
-namespace Microsoft.Extensions.WebEncoders
-{
- public class AllowedCharsBitmapTests
- {
- [Fact]
- public void Ctor_EmptyByDefault()
- {
- // Act
- var bitmap = AllowedCharsBitmap.CreateNew();
-
- // Assert
- for (int i = 0; i <= Char.MaxValue; i++)
- {
- Assert.False(bitmap.IsCharacterAllowed((char)i));
- }
- }
-
- [Fact]
- public void Allow_Forbid_ZigZag()
- {
- // Arrange
- var bitmap = AllowedCharsBitmap.CreateNew();
-
- // Act
- // The only chars which are allowed are those whose code points are multiples of 3 or 7
- // who aren't also multiples of 5. Exception: multiples of 35 are allowed.
- for (int i = 0; i <= Char.MaxValue; i += 3)
- {
- bitmap.AllowCharacter((char)i);
- }
- for (int i = 0; i <= Char.MaxValue; i += 5)
- {
- bitmap.ForbidCharacter((char)i);
- }
- for (int i = 0; i <= Char.MaxValue; i += 7)
- {
- bitmap.AllowCharacter((char)i);
- }
-
- // Assert
- for (int i = 0; i <= Char.MaxValue; i++)
- {
- bool isAllowed = false;
- if (i % 3 == 0) { isAllowed = true; }
- if (i % 5 == 0) { isAllowed = false; }
- if (i % 7 == 0) { isAllowed = true; }
- Assert.Equal(isAllowed, bitmap.IsCharacterAllowed((char)i));
- }
- }
-
- [Fact]
- public void Clear_ForbidsEverything()
- {
- // Arrange
- var bitmap = AllowedCharsBitmap.CreateNew();
- for (int i = 1; i <= Char.MaxValue; i++)
- {
- bitmap.AllowCharacter((char)i);
- }
-
- // Act
- bitmap.Clear();
-
- // Assert
- for (int i = 0; i <= Char.MaxValue; i++)
- {
- Assert.False(bitmap.IsCharacterAllowed((char)i));
- }
- }
-
- [Fact]
- public void Clone_MakesDeepCopy()
- {
- // Arrange
- var originalBitmap = AllowedCharsBitmap.CreateNew();
- originalBitmap.AllowCharacter('x');
-
- // Act
- var clonedBitmap = originalBitmap.Clone();
- clonedBitmap.AllowCharacter('y');
-
- // Assert
- Assert.True(originalBitmap.IsCharacterAllowed('x'));
- Assert.False(originalBitmap.IsCharacterAllowed('y'));
- Assert.True(clonedBitmap.IsCharacterAllowed('x'));
- Assert.True(clonedBitmap.IsCharacterAllowed('y'));
- }
-
- [Fact]
- public void ForbidUndefinedCharacters_RemovesUndefinedChars()
- {
- // Arrange
- // We only allow odd-numbered characters in this test so that
- // we can validate that we properly merged the two bitmaps together
- // rather than simply overwriting the target.
- var bitmap = AllowedCharsBitmap.CreateNew();
- for (int i = 1; i <= Char.MaxValue; i += 2)
- {
- bitmap.AllowCharacter((char)i);
- }
-
- // Act
- bitmap.ForbidUndefinedCharacters();
-
- // Assert
- for (int i = 0; i <= Char.MaxValue; i++)
- {
- if (i % 2 == 0)
- {
- Assert.False(bitmap.IsCharacterAllowed((char)i)); // these chars were never allowed in the original description
- }
- else
- {
- Assert.Equal(UnicodeHelpers.IsCharacterDefined((char)i), bitmap.IsCharacterAllowed((char)i));
- }
- }
- }
- }
-}
diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/CodePointFilterTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/CodePointFilterTests.cs
deleted file mode 100644
index 39624b1fb1..0000000000
--- a/test/Microsoft.Extensions.WebEncoders.Tests/CodePointFilterTests.cs
+++ /dev/null
@@ -1,365 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using Xunit;
-
-namespace Microsoft.Extensions.WebEncoders
-{
- public class CodePointFilterTests
- {
- [Fact]
- public void Ctor_Parameterless_CreatesEmptyFilter()
- {
- // Act
- var filter = new CodePointFilter();
-
- // Assert
- for (int i = 0; i <= Char.MaxValue; i++)
- {
- Assert.False(filter.IsCharacterAllowed((char)i));
- }
- }
-
- [Fact]
- public void Ctor_OtherCodePointFilterAsInterface()
- {
- // Arrange
- var originalFilter = new OddCodePointFilter();
-
- // Act
- var newFilter = new CodePointFilter(originalFilter);
-
- // Assert
- for (int i = 0; i <= Char.MaxValue; i++)
- {
- Assert.Equal((i % 2) == 1, newFilter.IsCharacterAllowed((char)i));
- }
- }
-
- [Fact]
- public void Ctor_OtherCodePointFilterAsConcreteType_Clones()
- {
- // Arrange
- var originalFilter = new CodePointFilter().AllowChar('x');
-
- // Act
- var newFilter = new CodePointFilter(originalFilter).AllowChar('y');
-
- // Assert
- Assert.True(originalFilter.IsCharacterAllowed('x'));
- Assert.False(originalFilter.IsCharacterAllowed('y'));
- Assert.True(newFilter.IsCharacterAllowed('x'));
- Assert.True(newFilter.IsCharacterAllowed('y'));
- }
-
- [Fact]
- public void Ctor_UnicodeRanges()
- {
- // Act
- var filter = new CodePointFilter(UnicodeRanges.LatinExtendedA, UnicodeRanges.LatinExtendedC);
-
- // Assert
- for (int i = 0; i < 0x0100; i++)
- {
- Assert.False(filter.IsCharacterAllowed((char)i));
- }
- for (int i = 0x0100; i <= 0x017F; i++)
- {
- Assert.True(filter.IsCharacterAllowed((char)i));
- }
- for (int i = 0x0180; i < 0x2C60; i++)
- {
- Assert.False(filter.IsCharacterAllowed((char)i));
- }
- for (int i = 0x2C60; i <= 0x2C7F; i++)
- {
- Assert.True(filter.IsCharacterAllowed((char)i));
- }
- for (int i = 0x2C80; i <= Char.MaxValue; i++)
- {
- Assert.False(filter.IsCharacterAllowed((char)i));
- }
- }
-
- [Fact]
- public void AllowChar()
- {
- // Arrange
- var filter = new CodePointFilter();
-
- // Act
- var retVal = filter.AllowChar('\u0100');
-
- // Assert
- Assert.Same(filter, retVal); // returns 'this' instance
- Assert.True(filter.IsCharacterAllowed('\u0100'));
- Assert.False(filter.IsCharacterAllowed('\u0101'));
- }
-
- [Fact]
- public void AllowChars_Array()
- {
- // Arrange
- var filter = new CodePointFilter();
-
- // Act
- var retVal = filter.AllowChars('\u0100', '\u0102');
-
- // Assert
- Assert.Same(filter, retVal); // returns 'this' instance
- Assert.True(filter.IsCharacterAllowed('\u0100'));
- Assert.False(filter.IsCharacterAllowed('\u0101'));
- Assert.True(filter.IsCharacterAllowed('\u0102'));
- Assert.False(filter.IsCharacterAllowed('\u0103'));
- }
-
- [Fact]
- public void AllowChars_String()
- {
- // Arrange
- var filter = new CodePointFilter();
-
- // Act
- var retVal = filter.AllowChars("\u0100\u0102");
-
- // Assert
- Assert.Same(filter, retVal); // returns 'this' instance
- Assert.True(filter.IsCharacterAllowed('\u0100'));
- Assert.False(filter.IsCharacterAllowed('\u0101'));
- Assert.True(filter.IsCharacterAllowed('\u0102'));
- Assert.False(filter.IsCharacterAllowed('\u0103'));
- }
-
- [Fact]
- public void AllowFilter()
- {
- // Arrange
- var filter = new CodePointFilter(UnicodeRanges.BasicLatin);
-
- // Act
- var retVal = filter.AllowFilter(new OddCodePointFilter());
-
- // Assert
- Assert.Same(filter, retVal); // returns 'this' instance
- for (int i = 0; i <= 0x007F; i++)
- {
- Assert.True(filter.IsCharacterAllowed((char)i));
- }
- for (int i = 0x0080; i <= Char.MaxValue; i++)
- {
- Assert.Equal((i % 2) == 1, filter.IsCharacterAllowed((char)i));
- }
- }
-
- [Fact]
- public void AllowRange()
- {
- // Arrange
- var filter = new CodePointFilter();
-
- // Act
- var retVal = filter.AllowRange(UnicodeRanges.LatinExtendedA);
-
- // Assert
- Assert.Same(filter, retVal); // returns 'this' instance
- for (int i = 0; i < 0x0100; i++)
- {
- Assert.False(filter.IsCharacterAllowed((char)i));
- }
- for (int i = 0x0100; i <= 0x017F; i++)
- {
- Assert.True(filter.IsCharacterAllowed((char)i));
- }
- for (int i = 0x0180; i <= Char.MaxValue; i++)
- {
- Assert.False(filter.IsCharacterAllowed((char)i));
- }
- }
-
- [Fact]
- public void AllowRanges()
- {
- // Arrange
- var filter = new CodePointFilter();
-
- // Act
- var retVal = filter.AllowRanges(UnicodeRanges.LatinExtendedA, UnicodeRanges.LatinExtendedC);
-
- // Assert
- Assert.Same(filter, retVal); // returns 'this' instance
- for (int i = 0; i < 0x0100; i++)
- {
- Assert.False(filter.IsCharacterAllowed((char)i));
- }
- for (int i = 0x0100; i <= 0x017F; i++)
- {
- Assert.True(filter.IsCharacterAllowed((char)i));
- }
- for (int i = 0x0180; i < 0x2C60; i++)
- {
- Assert.False(filter.IsCharacterAllowed((char)i));
- }
- for (int i = 0x2C60; i <= 0x2C7F; i++)
- {
- Assert.True(filter.IsCharacterAllowed((char)i));
- }
- for (int i = 0x2C80; i <= Char.MaxValue; i++)
- {
- Assert.False(filter.IsCharacterAllowed((char)i));
- }
- }
-
- [Fact]
- public void Clear()
- {
- // Arrange
- var filter = new CodePointFilter();
- for (int i = 1; i <= Char.MaxValue; i++)
- {
- filter.AllowChar((char)i);
- }
-
- // Act
- var retVal = filter.Clear();
-
- // Assert
- Assert.Same(filter, retVal); // returns 'this' instance
- for (int i = 0; i <= Char.MaxValue; i++)
- {
- Assert.False(filter.IsCharacterAllowed((char)i));
- }
- }
-
- [Fact]
- public void ForbidChar()
- {
- // Arrange
- var filter = new CodePointFilter(UnicodeRanges.BasicLatin);
-
- // Act
- var retVal = filter.ForbidChar('x');
-
- // Assert
- Assert.Same(filter, retVal); // returns 'this' instance
- Assert.True(filter.IsCharacterAllowed('w'));
- Assert.False(filter.IsCharacterAllowed('x'));
- Assert.True(filter.IsCharacterAllowed('y'));
- Assert.True(filter.IsCharacterAllowed('z'));
- }
-
- [Fact]
- public void ForbidChars_Array()
- {
- // Arrange
- var filter = new CodePointFilter(UnicodeRanges.BasicLatin);
-
- // Act
- var retVal = filter.ForbidChars('x', 'z');
-
- // Assert
- Assert.Same(filter, retVal); // returns 'this' instance
- Assert.True(filter.IsCharacterAllowed('w'));
- Assert.False(filter.IsCharacterAllowed('x'));
- Assert.True(filter.IsCharacterAllowed('y'));
- Assert.False(filter.IsCharacterAllowed('z'));
- }
-
- [Fact]
- public void ForbidChars_String()
- {
- // Arrange
- var filter = new CodePointFilter(UnicodeRanges.BasicLatin);
-
- // Act
- var retVal = filter.ForbidChars("xz");
-
- // Assert
- Assert.Same(filter, retVal); // returns 'this' instance
- Assert.True(filter.IsCharacterAllowed('w'));
- Assert.False(filter.IsCharacterAllowed('x'));
- Assert.True(filter.IsCharacterAllowed('y'));
- Assert.False(filter.IsCharacterAllowed('z'));
- }
-
- [Fact]
- public void ForbidRange()
- {
- // Arrange
- var filter = new CodePointFilter(new OddCodePointFilter());
-
- // Act
- var retVal = filter.ForbidRange(UnicodeRanges.Specials);
-
- // Assert
- Assert.Same(filter, retVal); // returns 'this' instance
- for (int i = 0; i <= 0xFFEF; i++)
- {
- Assert.Equal((i % 2) == 1, filter.IsCharacterAllowed((char)i));
- }
- for (int i = 0xFFF0; i <= Char.MaxValue; i++)
- {
- Assert.False(filter.IsCharacterAllowed((char)i));
- }
- }
-
- [Fact]
- public void ForbidRanges()
- {
- // Arrange
- var filter = new CodePointFilter(new OddCodePointFilter());
-
- // Act
- var retVal = filter.ForbidRanges(UnicodeRanges.BasicLatin, UnicodeRanges.Specials);
-
- // Assert
- Assert.Same(filter, retVal); // returns 'this' instance
- for (int i = 0; i <= 0x007F; i++)
- {
- Assert.False(filter.IsCharacterAllowed((char)i));
- }
- for (int i = 0x0080; i <= 0xFFEF; i++)
- {
- Assert.Equal((i % 2) == 1, filter.IsCharacterAllowed((char)i));
- }
- for (int i = 0xFFF0; i <= Char.MaxValue; i++)
- {
- Assert.False(filter.IsCharacterAllowed((char)i));
- }
- }
-
- [Fact]
- public void GetAllowedCodePoints()
- {
- // Arrange
- var expected = Enumerable.Range(UnicodeRanges.BasicLatin.FirstCodePoint, UnicodeRanges.BasicLatin.RangeSize)
- .Concat(Enumerable.Range(UnicodeRanges.Specials.FirstCodePoint, UnicodeRanges.Specials.RangeSize))
- .Except(new int[] { 'x' })
- .OrderBy(i => i)
- .ToArray();
-
- var filter = new CodePointFilter(UnicodeRanges.BasicLatin, UnicodeRanges.Specials);
- filter.ForbidChar('x');
-
- // Act
- var retVal = filter.GetAllowedCodePoints().OrderBy(i => i).ToArray();
-
- // Assert
- Assert.Equal(expected, retVal);
- }
-
- // a code point filter which allows only odd code points through
- private sealed class OddCodePointFilter : ICodePointFilter
- {
- public IEnumerable GetAllowedCodePoints()
- {
- for (int i = 1; i <= Char.MaxValue; i += 2)
- {
- yield return i;
- }
- }
- }
- }
-}
diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/CommonTestEncoder.cs b/test/Microsoft.Extensions.WebEncoders.Tests/CommonTestEncoder.cs
deleted file mode 100644
index b78d91e8c2..0000000000
--- a/test/Microsoft.Extensions.WebEncoders.Tests/CommonTestEncoder.cs
+++ /dev/null
@@ -1,103 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-using System.Globalization;
-using System.IO;
-using System.Runtime.CompilerServices;
-
-namespace Microsoft.Extensions.WebEncoders
-{
- ///
- /// Encoder used for unit testing.
- ///
- internal sealed class CommonTestEncoder : IHtmlEncoder, IJavaScriptStringEncoder, IUrlEncoder
- {
- ///
- /// Returns "HtmlEncode[[value]]".
- ///
- public string HtmlEncode(string value)
- {
- return EncodeCore(value);
- }
-
- ///
- /// Writes "HtmlEncode[[value]]".
- ///
- public void HtmlEncode(string value, int startIndex, int charCount, TextWriter output)
- {
- EncodeCore(value, startIndex, charCount, output);
- }
-
- ///
- /// Writes "HtmlEncode[[value]]".
- ///
- public void HtmlEncode(char[] value, int startIndex, int charCount, TextWriter output)
- {
- EncodeCore(value, startIndex, charCount, output);
- }
-
- ///
- /// Returns "JavaScriptStringEncode[[value]]".
- ///
- public string JavaScriptStringEncode(string value)
- {
- return EncodeCore(value);
- }
-
- ///
- /// Writes "JavaScriptStringEncode[[value]]".
- ///
- public void JavaScriptStringEncode(string value, int startIndex, int charCount, TextWriter output)
- {
- EncodeCore(value, startIndex, charCount, output);
- }
-
- ///
- /// Writes "JavaScriptStringEncode[[value]]".
- ///
- public void JavaScriptStringEncode(char[] value, int startIndex, int charCount, TextWriter output)
- {
- EncodeCore(value, startIndex, charCount, output);
- }
-
- ///
- /// Returns "UrlEncode[[value]]".
- ///
- public string UrlEncode(string value)
- {
- return EncodeCore(value);
- }
-
- ///
- /// Writes "UrlEncode[[value]]".
- ///
- public void UrlEncode(string value, int startIndex, int charCount, TextWriter output)
- {
- EncodeCore(value, startIndex, charCount, output);
- }
-
- ///
- /// Writes "UrlEncode[[value]]".
- ///
- public void UrlEncode(char[] value, int startIndex, int charCount, TextWriter output)
- {
- EncodeCore(value, startIndex, charCount, output);
- }
-
- private static string EncodeCore(string value, [CallerMemberName] string encodeType = null)
- {
- return String.Format(CultureInfo.InvariantCulture, "{0}[[{1}]]", encodeType, value);
- }
-
- private static void EncodeCore(string value, int startIndex, int charCount, TextWriter output, [CallerMemberName] string encodeType = null)
- {
- output.Write(EncodeCore(value.Substring(startIndex, charCount), encodeType));
- }
-
- private static void EncodeCore(char[] value, int startIndex, int charCount, TextWriter output, [CallerMemberName] string encodeType = null)
- {
- output.Write(EncodeCore(new string(value, startIndex, charCount), encodeType));
- }
- }
-}
\ No newline at end of file
diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/EncoderCommonTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/EncoderCommonTests.cs
deleted file mode 100644
index ac9fc8bb28..0000000000
--- a/test/Microsoft.Extensions.WebEncoders.Tests/EncoderCommonTests.cs
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-using Xunit;
-
-namespace Microsoft.Extensions.WebEncoders
-{
- public class EncoderCommonTests
- {
- [Theory]
- [InlineData(10000, 3, 16 * 1024)] // we cap at 16k chars
- [InlineData(5000, 3, 15000)] // haven't exceeded the 16k cap
- [InlineData(40000, 3, 40000)] // if we spill over the LOH, we still allocate an output buffer equivalent in length to the input buffer
- [InlineData(512, Int32.MaxValue, 16 * 1024)] // make sure we can handle numeric overflow
- public void GetCapacityOfOutputStringBuilder(int numCharsToEncode, int worstCaseOutputCharsPerInputChar, int expectedResult)
- {
- Assert.Equal(expectedResult, EncoderCommon.GetCapacityOfOutputStringBuilder(numCharsToEncode, worstCaseOutputCharsPerInputChar));
- }
- }
-}
diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/EncoderExtensionsTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/EncoderExtensionsTests.cs
deleted file mode 100644
index abdc1d9cc2..0000000000
--- a/test/Microsoft.Extensions.WebEncoders.Tests/EncoderExtensionsTests.cs
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-using System.IO;
-using Xunit;
-
-namespace Microsoft.Extensions.WebEncoders
-{
- public class EncoderExtensionsTests
- {
- [Fact]
- public void HtmlEncode_ParameterChecks()
- {
- Assert.Throws(() => EncoderExtensions.HtmlEncode(null, "Hello!", new StringWriter()));
- }
-
- [Fact]
- public void HtmlEncode_PositiveTestCase()
- {
- // Arrange
- IHtmlEncoder encoder = new HtmlEncoder(UnicodeRanges.All);
- StringWriter writer = new StringWriter();
-
- // Act
- encoder.HtmlEncode("Hello+there!", writer);
-
- // Assert
- Assert.Equal("Hello+there!", writer.ToString());
- }
-
- [Fact]
- public void JavaScriptStringEncode_ParameterChecks()
- {
- Assert.Throws(() => EncoderExtensions.JavaScriptStringEncode(null, "Hello!", new StringWriter()));
- }
-
- [Fact]
- public void JavaScriptStringEncode_PositiveTestCase()
- {
- // Arrange
- IJavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeRanges.All);
- StringWriter writer = new StringWriter();
-
- // Act
- encoder.JavaScriptStringEncode("Hello+there!", writer);
-
- // Assert
- Assert.Equal(@"Hello\u002Bthere!", writer.ToString());
- }
-
- [Fact]
- public void UrlEncode_ParameterChecks()
- {
- Assert.Throws(() => EncoderExtensions.UrlEncode(null, "Hello!", new StringWriter()));
- }
-
- [Fact]
- public void UrlEncode_PositiveTestCase()
- {
- // Arrange
- IUrlEncoder encoder = new UrlEncoder(UnicodeRanges.All);
- StringWriter writer = new StringWriter();
-
- // Act
- encoder.UrlEncode("Hello+there!", writer);
-
- // Assert
- Assert.Equal("Hello%2Bthere!", writer.ToString());
- }
- }
-}
diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs
index 790210be39..8e060102bb 100644
--- a/test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs
+++ b/test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs
@@ -1,7 +1,9 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+using System.Text.Encodings.Web;
using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.WebEncoders.Testing;
using Xunit;
namespace Microsoft.Extensions.WebEncoders
@@ -19,12 +21,12 @@ namespace Microsoft.Extensions.WebEncoders
// Assert
var serviceProvider = serviceCollection.BuildServiceProvider();
- Assert.Same(HtmlEncoder.Default, serviceProvider.GetRequiredService()); // default encoder
- Assert.Same(HtmlEncoder.Default, serviceProvider.GetRequiredService()); // as singleton instance
- Assert.Same(JavaScriptStringEncoder.Default, serviceProvider.GetRequiredService()); // default encoder
- Assert.Same(JavaScriptStringEncoder.Default, serviceProvider.GetRequiredService()); // as singleton instance
- Assert.Same(UrlEncoder.Default, serviceProvider.GetRequiredService()); // default encoder
- Assert.Same(UrlEncoder.Default, serviceProvider.GetRequiredService()); // as singleton instance
+ Assert.Same(HtmlEncoder.Default, serviceProvider.GetRequiredService()); // default encoder
+ Assert.Same(HtmlEncoder.Default, serviceProvider.GetRequiredService()); // as singleton instance
+ Assert.Same(JavaScriptEncoder.Default, serviceProvider.GetRequiredService()); // default encoder
+ Assert.Same(JavaScriptEncoder.Default, serviceProvider.GetRequiredService()); // as singleton instance
+ Assert.Same(UrlEncoder.Default, serviceProvider.GetRequiredService()); // default encoder
+ Assert.Same(UrlEncoder.Default, serviceProvider.GetRequiredService()); // as singleton instance
}
[Fact]
@@ -36,23 +38,24 @@ namespace Microsoft.Extensions.WebEncoders
// Act
serviceCollection.AddWebEncoders(options =>
{
- options.CodePointFilter = new CodePointFilter().AllowChars("ace"); // only these three chars are allowed
+ options.TextEncoderSettings = new TextEncoderSettings();
+ options.TextEncoderSettings.AllowCharacters("ace".ToCharArray()); // only these three chars are allowed
});
// Assert
var serviceProvider = serviceCollection.BuildServiceProvider();
- var htmlEncoder = serviceProvider.GetRequiredService();
- Assert.Equal("abcde", htmlEncoder.HtmlEncode("abcde"));
- Assert.Same(htmlEncoder, serviceProvider.GetRequiredService()); // as singleton instance
+ var htmlEncoder = serviceProvider.GetRequiredService();
+ Assert.Equal("abcde", htmlEncoder.Encode("abcde"));
+ Assert.Same(htmlEncoder, serviceProvider.GetRequiredService()); // as singleton instance
- var javaScriptStringEncoder = serviceProvider.GetRequiredService();
- Assert.Equal(@"a\u0062c\u0064e", javaScriptStringEncoder.JavaScriptStringEncode("abcde"));
- Assert.Same(javaScriptStringEncoder, serviceProvider.GetRequiredService()); // as singleton instance
+ var javaScriptEncoder = serviceProvider.GetRequiredService();
+ Assert.Equal(@"a\u0062c\u0064e", javaScriptEncoder.Encode("abcde"));
+ Assert.Same(javaScriptEncoder, serviceProvider.GetRequiredService()); // as singleton instance
- var urlEncoder = serviceProvider.GetRequiredService();
- Assert.Equal("a%62c%64e", urlEncoder.UrlEncode("abcde"));
- Assert.Same(urlEncoder, serviceProvider.GetRequiredService()); // as singleton instance
+ var urlEncoder = serviceProvider.GetRequiredService();
+ Assert.Equal("a%62c%64e", urlEncoder.Encode("abcde"));
+ Assert.Same(urlEncoder, serviceProvider.GetRequiredService()); // as singleton instance
}
[Fact]
@@ -62,25 +65,26 @@ namespace Microsoft.Extensions.WebEncoders
var serviceCollection = new ServiceCollection();
// Act
- serviceCollection.AddSingleton();
- serviceCollection.AddSingleton();
+ serviceCollection.AddSingleton();
+ serviceCollection.AddSingleton();
// we don't register an existing URL encoder
serviceCollection.AddWebEncoders(options =>
{
- options.CodePointFilter = new CodePointFilter().AllowChars("ace"); // only these three chars are allowed
+ options.TextEncoderSettings = new TextEncoderSettings();
+ options.TextEncoderSettings.AllowCharacters("ace".ToCharArray()); // only these three chars are allowed
});
// Assert
var serviceProvider = serviceCollection.BuildServiceProvider();
var htmlEncoder = serviceProvider.GetHtmlEncoder();
- Assert.Equal("HtmlEncode[[abcde]]", htmlEncoder.HtmlEncode("abcde"));
+ Assert.Equal("HtmlEncode[[abcde]]", htmlEncoder.Encode("abcde"));
- var javaScriptStringEncoder = serviceProvider.GetJavaScriptStringEncoder();
- Assert.Equal("JavaScriptStringEncode[[abcde]]", javaScriptStringEncoder.JavaScriptStringEncode("abcde"));
+ var javaScriptEncoder = serviceProvider.GetJavaScriptEncoder();
+ Assert.Equal("JavaScriptEncode[[abcde]]", javaScriptEncoder.Encode("abcde"));
var urlEncoder = serviceProvider.GetUrlEncoder();
- Assert.Equal("a%62c%64e", urlEncoder.UrlEncode("abcde"));
+ Assert.Equal("a%62c%64e", urlEncoder.Encode("abcde"));
}
}
}
diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs
index b62068a941..01492e759e 100644
--- a/test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs
+++ b/test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs
@@ -2,6 +2,7 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
+using System.Text.Encodings.Web;
using Xunit;
namespace Microsoft.Extensions.WebEncoders
@@ -25,7 +26,7 @@ namespace Microsoft.Extensions.WebEncoders
public void GetHtmlEncoder_ServiceProviderHasEncoder_ReturnsRegisteredInstance()
{
// Arrange
- var expectedEncoder = new HtmlEncoder();
+ var expectedEncoder = HtmlEncoder.Default;
var serviceProvider = new TestServiceProvider() { Service = expectedEncoder };
// Act
@@ -36,27 +37,27 @@ namespace Microsoft.Extensions.WebEncoders
}
[Fact]
- public void GetJavaScriptStringEncoder_ServiceProviderDoesNotHaveEncoder_UsesDefault()
+ public void GetJavaScriptEncoder_ServiceProviderDoesNotHaveEncoder_UsesDefault()
{
// Arrange
var serviceProvider = new TestServiceProvider();
// Act
- var retVal = serviceProvider.GetJavaScriptStringEncoder();
+ var retVal = serviceProvider.GetJavaScriptEncoder();
// Assert
- Assert.Same(JavaScriptStringEncoder.Default, retVal);
+ Assert.Same(JavaScriptEncoder.Default, retVal);
}
[Fact]
- public void GetJavaScriptStringEncoder_ServiceProviderHasEncoder_ReturnsRegisteredInstance()
+ public void GetJavaScriptEncoder_ServiceProviderHasEncoder_ReturnsRegisteredInstance()
{
// Arrange
- var expectedEncoder = new JavaScriptStringEncoder();
+ var expectedEncoder = JavaScriptEncoder.Default;
var serviceProvider = new TestServiceProvider() { Service = expectedEncoder };
// Act
- var retVal = serviceProvider.GetJavaScriptStringEncoder();
+ var retVal = serviceProvider.GetJavaScriptEncoder();
// Assert
Assert.Same(expectedEncoder, retVal);
@@ -79,7 +80,7 @@ namespace Microsoft.Extensions.WebEncoders
public void GetUrlEncoder_ServiceProviderHasEncoder_ReturnsRegisteredInstance()
{
// Arrange
- var expectedEncoder = new UrlEncoder();
+ var expectedEncoder = UrlEncoder.Default;
var serviceProvider = new TestServiceProvider() { Service = expectedEncoder };
// Act
diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/Entities.cs b/test/Microsoft.Extensions.WebEncoders.Tests/Entities.cs
deleted file mode 100644
index c872b7bf9d..0000000000
--- a/test/Microsoft.Extensions.WebEncoders.Tests/Entities.cs
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using Newtonsoft.Json;
-
-namespace Microsoft.Extensions.WebEncoders
-{
- internal static class Entities
- {
- public static readonly IDictionary ParsedEntities = GetParsedEntities();
-
- private static IDictionary GetParsedEntities()
- {
- // read all entries
- string allEntitiesText = ReadEntitiesJsonFile();
- var deserializedRawData = new JsonSerializer().Deserialize>(new JsonTextReader(new StringReader(allEntitiesText)));
-
- // strip out all entries which aren't of the form "&entity;"
- foreach (var key in deserializedRawData.Keys.ToArray() /* dupe since we're mutating original structure */)
- {
- if (!key.StartsWith("&", StringComparison.Ordinal) || !key.EndsWith(";", StringComparison.Ordinal))
- {
- deserializedRawData.Remove(key);
- }
- }
- return deserializedRawData;
- }
-
- private static string ReadEntitiesJsonFile()
- {
- return File.ReadAllText("entities.json");
- }
- }
-}
diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/Extensions.cs b/test/Microsoft.Extensions.WebEncoders.Tests/Extensions.cs
deleted file mode 100644
index 97b157b7d5..0000000000
--- a/test/Microsoft.Extensions.WebEncoders.Tests/Extensions.cs
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-
-namespace Microsoft.Extensions.WebEncoders
-{
- public static class Extensions
- {
- public static string[] ReadAllLines(this TextReader reader)
- {
- return ReadAllLinesImpl(reader).ToArray();
- }
-
- private static IEnumerable ReadAllLinesImpl(TextReader reader)
- {
- string line;
- while ((line = reader.ReadLine()) != null)
- {
- yield return line;
- }
- }
- }
-}
diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/HtmlEncoderTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/HtmlEncoderTests.cs
deleted file mode 100644
index 8fe2ddde62..0000000000
--- a/test/Microsoft.Extensions.WebEncoders.Tests/HtmlEncoderTests.cs
+++ /dev/null
@@ -1,269 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-using System.Globalization;
-using System.IO;
-using Xunit;
-
-namespace Microsoft.Extensions.WebEncoders
-{
- public class HtmlEncoderTests
- {
- [Fact]
- public void Ctor_WithCodePointFilter()
- {
- // Arrange
- var filter = new CodePointFilter().AllowChars("ab").AllowChars('\0', '&', '\uFFFF', 'd');
- HtmlEncoder encoder = new HtmlEncoder(filter);
-
- // Act & assert
- Assert.Equal("a", encoder.HtmlEncode("a"));
- Assert.Equal("b", encoder.HtmlEncode("b"));
- Assert.Equal("c", encoder.HtmlEncode("c"));
- Assert.Equal("d", encoder.HtmlEncode("d"));
- Assert.Equal("", encoder.HtmlEncode("\0")); // we still always encode control chars
- Assert.Equal("&", encoder.HtmlEncode("&")); // we still always encode HTML-special chars
- Assert.Equal("", encoder.HtmlEncode("\uFFFF")); // we still always encode non-chars and other forbidden chars
- }
-
- [Fact]
- public void Ctor_WithUnicodeRanges()
- {
- // Arrange
- HtmlEncoder encoder = new HtmlEncoder(UnicodeRanges.Latin1Supplement, UnicodeRanges.MiscellaneousSymbols);
-
- // Act & assert
- Assert.Equal("a", encoder.HtmlEncode("a"));
- Assert.Equal("\u00E9", encoder.HtmlEncode("\u00E9" /* LATIN SMALL LETTER E WITH ACUTE */));
- Assert.Equal("\u2601", encoder.HtmlEncode("\u2601" /* CLOUD */));
- }
-
- [Fact]
- public void Ctor_WithNoParameters_DefaultsToBasicLatin()
- {
- // Arrange
- HtmlEncoder encoder = new HtmlEncoder();
-
- // Act & assert
- Assert.Equal("a", encoder.HtmlEncode("a"));
- Assert.Equal("é", encoder.HtmlEncode("\u00E9" /* LATIN SMALL LETTER E WITH ACUTE */));
- Assert.Equal("☁", encoder.HtmlEncode("\u2601" /* CLOUD */));
- }
-
- [Fact]
- public void Default_EquivalentToBasicLatin()
- {
- // Arrange
- HtmlEncoder controlEncoder = new HtmlEncoder(UnicodeRanges.BasicLatin);
- HtmlEncoder testEncoder = HtmlEncoder.Default;
-
- // Act & assert
- for (int i = 0; i <= Char.MaxValue; i++)
- {
- if (!IsSurrogateCodePoint(i))
- {
- string input = new String((char)i, 1);
- Assert.Equal(controlEncoder.HtmlEncode(input), testEncoder.HtmlEncode(input));
- }
- }
- }
-
- [Fact]
- public void Default_ReturnsSingletonInstance()
- {
- // Act
- HtmlEncoder encoder1 = HtmlEncoder.Default;
- HtmlEncoder encoder2 = HtmlEncoder.Default;
-
- // Assert
- Assert.Same(encoder1, encoder2);
- }
-
- [Theory]
- [InlineData("<", "<")]
- [InlineData(">", ">")]
- [InlineData("&", "&")]
- [InlineData("'", "'")]
- [InlineData("\"", """)]
- [InlineData("+", "+")]
- public void HtmlEncode_AllRangesAllowed_StillEncodesForbiddenChars_Simple(string input, string expected)
- {
- // Arrange
- HtmlEncoder encoder = new HtmlEncoder(UnicodeRanges.All);
-
- // Act
- string retVal = encoder.HtmlEncode(input);
-
- // Assert
- Assert.Equal(expected, retVal);
- }
-
- [Fact]
- public void HtmlEncode_AllRangesAllowed_StillEncodesForbiddenChars_Extended()
- {
- // Arrange
- HtmlEncoder encoder = new HtmlEncoder(UnicodeRanges.All);
-
- // Act & assert - BMP chars
- for (int i = 0; i <= 0xFFFF; i++)
- {
- string input = new String((char)i, 1);
- string expected;
- if (IsSurrogateCodePoint(i))
- {
- expected = "\uFFFD"; // unpaired surrogate -> Unicode replacement char
- }
- else
- {
- if (input == "<") { expected = "<"; }
- else if (input == ">") { expected = ">"; }
- else if (input == "&") { expected = "&"; }
- else if (input == "\"") { expected = """; }
- else
- {
- bool mustEncode = false;
- if (i == '\'' || i == '+')
- {
- mustEncode = true; // apostrophe, plus
- }
- else if (i <= 0x001F || (0x007F <= i && i <= 0x9F))
- {
- mustEncode = true; // control char
- }
- else if (!UnicodeHelpers.IsCharacterDefined((char)i))
- {
- mustEncode = true; // undefined (or otherwise disallowed) char
- }
-
- if (mustEncode)
- {
- expected = String.Format(CultureInfo.InvariantCulture, "{0:X};", i);
- }
- else
- {
- expected = input; // no encoding
- }
- }
- }
-
- string retVal = encoder.HtmlEncode(input);
- Assert.Equal(expected, retVal);
- }
-
- // Act & assert - astral chars
- for (int i = 0x10000; i <= 0x10FFFF; i++)
- {
- string input = Char.ConvertFromUtf32(i);
- string expected = String.Format(CultureInfo.InvariantCulture, "{0:X};", i);
- string retVal = encoder.HtmlEncode(input);
- Assert.Equal(expected, retVal);
- }
- }
-
- [Fact]
- public void HtmlEncode_BadSurrogates_ReturnsUnicodeReplacementChar()
- {
- // Arrange
- HtmlEncoder encoder = new HtmlEncoder(UnicodeRanges.All); // allow all codepoints
-
- // "abcde"
- const string input = "a\uD800b\uDFFFc\uDFFF\uD800d\uDFFF\uD800\uDFFFe\uD800";
- const string expected = "a\uFFFDb\uFFFDc\uFFFD\uFFFDd\uFFFDe\uFFFD";
-
- // Act
- string retVal = encoder.HtmlEncode(input);
-
- // Assert
- Assert.Equal(expected, retVal);
- }
-
- [Fact]
- public void HtmlEncode_EmptyStringInput_ReturnsEmptyString()
- {
- // Arrange
- HtmlEncoder encoder = new HtmlEncoder();
-
- // Act & assert
- Assert.Equal("", encoder.HtmlEncode(""));
- }
-
- [Fact]
- public void HtmlEncode_InputDoesNotRequireEncoding_ReturnsOriginalStringInstance()
- {
- // Arrange
- HtmlEncoder encoder = new HtmlEncoder();
- string input = "Hello, there!";
-
- // Act & assert
- Assert.Same(input, encoder.HtmlEncode(input));
- }
-
- [Fact]
- public void HtmlEncode_NullInput_ReturnsNull()
- {
- // Arrange
- HtmlEncoder encoder = new HtmlEncoder();
-
- // Act & assert
- Assert.Null(encoder.HtmlEncode(null));
- }
-
- [Fact]
- public void HtmlEncode_WithCharsRequiringEncodingAtBeginning()
- {
- Assert.Equal("&Hello, there!", new HtmlEncoder().HtmlEncode("&Hello, there!"));
- }
-
- [Fact]
- public void HtmlEncode_WithCharsRequiringEncodingAtEnd()
- {
- Assert.Equal("Hello, there!&", new HtmlEncoder().HtmlEncode("Hello, there!&"));
- }
-
- [Fact]
- public void HtmlEncode_WithCharsRequiringEncodingInMiddle()
- {
- Assert.Equal("Hello, &there!", new HtmlEncoder().HtmlEncode("Hello, &there!"));
- }
-
- [Fact]
- public void HtmlEncode_WithCharsRequiringEncodingInterspersed()
- {
- Assert.Equal("Hello, <there>!", new HtmlEncoder().HtmlEncode("Hello, !"));
- }
-
- [Fact]
- public void HtmlEncode_CharArray()
- {
- // Arrange
- HtmlEncoder encoder = new HtmlEncoder();
- var output = new StringWriter();
-
- // Act
- encoder.HtmlEncode("Hello+world!".ToCharArray(), 3, 5, output);
-
- // Assert
- Assert.Equal("lo+wo", output.ToString());
- }
-
- [Fact]
- public void HtmlEncode_StringSubstring()
- {
- // Arrange
- HtmlEncoder encoder = new HtmlEncoder();
- var output = new StringWriter();
-
- // Act
- encoder.HtmlEncode("Hello+world!", 3, 5, output);
-
- // Assert
- Assert.Equal("lo+wo", output.ToString());
- }
-
- private static bool IsSurrogateCodePoint(int codePoint)
- {
- return (0xD800 <= codePoint && codePoint <= 0xDFFF);
- }
- }
-}
diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/JavaScriptStringEncoderTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/JavaScriptStringEncoderTests.cs
deleted file mode 100644
index b4d4f250de..0000000000
--- a/test/Microsoft.Extensions.WebEncoders.Tests/JavaScriptStringEncoderTests.cs
+++ /dev/null
@@ -1,331 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-using System.Globalization;
-using System.IO;
-using Xunit;
-
-namespace Microsoft.Extensions.WebEncoders
-{
- public class JavaScriptStringEncoderTests
- {
- [Fact]
- public void Ctor_WithCodePointFilter()
- {
- // Arrange
- var filter = new CodePointFilter().AllowChars("ab").AllowChars('\0', '&', '\uFFFF', 'd');
- JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(filter);
-
- // Act & assert
- Assert.Equal("a", encoder.JavaScriptStringEncode("a"));
- Assert.Equal("b", encoder.JavaScriptStringEncode("b"));
- Assert.Equal(@"\u0063", encoder.JavaScriptStringEncode("c"));
- Assert.Equal("d", encoder.JavaScriptStringEncode("d"));
- Assert.Equal(@"\u0000", encoder.JavaScriptStringEncode("\0")); // we still always encode control chars
- Assert.Equal(@"\u0026", encoder.JavaScriptStringEncode("&")); // we still always encode HTML-special chars
- Assert.Equal(@"\uFFFF", encoder.JavaScriptStringEncode("\uFFFF")); // we still always encode non-chars and other forbidden chars
- }
-
- [Fact]
- public void Ctor_WithUnicodeRanges()
- {
- // Arrange
- JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeRanges.Latin1Supplement, UnicodeRanges.MiscellaneousSymbols);
-
- // Act & assert
- Assert.Equal(@"\u0061", encoder.JavaScriptStringEncode("a"));
- Assert.Equal("\u00E9", encoder.JavaScriptStringEncode("\u00E9" /* LATIN SMALL LETTER E WITH ACUTE */));
- Assert.Equal("\u2601", encoder.JavaScriptStringEncode("\u2601" /* CLOUD */));
- }
-
- [Fact]
- public void Ctor_WithNoParameters_DefaultsToBasicLatin()
- {
- // Arrange
- JavaScriptStringEncoder encoder = new JavaScriptStringEncoder();
-
- // Act & assert
- Assert.Equal("a", encoder.JavaScriptStringEncode("a"));
- Assert.Equal(@"\u00E9", encoder.JavaScriptStringEncode("\u00E9" /* LATIN SMALL LETTER E WITH ACUTE */));
- Assert.Equal(@"\u2601", encoder.JavaScriptStringEncode("\u2601" /* CLOUD */));
- }
-
- [Fact]
- public void Default_EquivalentToBasicLatin()
- {
- // Arrange
- JavaScriptStringEncoder controlEncoder = new JavaScriptStringEncoder(UnicodeRanges.BasicLatin);
- JavaScriptStringEncoder testEncoder = JavaScriptStringEncoder.Default;
-
- // Act & assert
- for (int i = 0; i <= Char.MaxValue; i++)
- {
- if (!IsSurrogateCodePoint(i))
- {
- string input = new String((char)i, 1);
- Assert.Equal(controlEncoder.JavaScriptStringEncode(input), testEncoder.JavaScriptStringEncode(input));
- }
- }
- }
-
- [Fact]
- public void Default_ReturnsSingletonInstance()
- {
- // Act
- JavaScriptStringEncoder encoder1 = JavaScriptStringEncoder.Default;
- JavaScriptStringEncoder encoder2 = JavaScriptStringEncoder.Default;
-
- // Assert
- Assert.Same(encoder1, encoder2);
- }
-
- [Theory]
- [InlineData("<", @"\u003C")]
- [InlineData(">", @"\u003E")]
- [InlineData("&", @"\u0026")]
- [InlineData("'", @"\u0027")]
- [InlineData("\"", @"\u0022")]
- [InlineData("+", @"\u002B")]
- [InlineData("\\", @"\\")]
- [InlineData("/", @"\/")]
- [InlineData("\b", @"\b")]
- [InlineData("\f", @"\f")]
- [InlineData("\n", @"\n")]
- [InlineData("\t", @"\t")]
- [InlineData("\r", @"\r")]
- public void JavaScriptStringEncode_AllRangesAllowed_StillEncodesForbiddenChars_Simple(string input, string expected)
- {
- // Arrange
- JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeRanges.All);
-
- // Act
- string retVal = encoder.JavaScriptStringEncode(input);
-
- // Assert
- Assert.Equal(expected, retVal);
- }
-
- [Fact]
- public void JavaScriptStringEncode_AllRangesAllowed_StillEncodesForbiddenChars_Extended()
- {
- // Arrange
- JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeRanges.All);
-
- // Act & assert - BMP chars
- for (int i = 0; i <= 0xFFFF; i++)
- {
- string input = new String((char)i, 1);
- string expected;
- if (IsSurrogateCodePoint(i))
- {
- expected = "\uFFFD"; // unpaired surrogate -> Unicode replacement char
- }
- else
- {
- if (input == "\b") { expected = @"\b"; }
- else if (input == "\t") { expected = @"\t"; }
- else if (input == "\n") { expected = @"\n"; }
- else if (input == "\f") { expected = @"\f"; }
- else if (input == "\r") { expected = @"\r"; }
- else if (input == "\\") { expected = @"\\"; }
- else if (input == "/") { expected = @"\/"; }
- else
- {
- bool mustEncode = false;
- switch (i)
- {
- case '<':
- case '>':
- case '&':
- case '\"':
- case '\'':
- case '+':
- mustEncode = true;
- break;
- }
-
- if (i <= 0x001F || (0x007F <= i && i <= 0x9F))
- {
- mustEncode = true; // control char
- }
- else if (!UnicodeHelpers.IsCharacterDefined((char)i))
- {
- mustEncode = true; // undefined (or otherwise disallowed) char
- }
-
- if (mustEncode)
- {
- expected = String.Format(CultureInfo.InvariantCulture, @"\u{0:X4}", i);
- }
- else
- {
- expected = input; // no encoding
- }
- }
- }
-
- string retVal = encoder.JavaScriptStringEncode(input);
- Assert.Equal(expected, retVal);
- }
-
- // Act & assert - astral chars
- for (int i = 0x10000; i <= 0x10FFFF; i++)
- {
- string input = Char.ConvertFromUtf32(i);
- string expected = String.Format(CultureInfo.InvariantCulture, @"\u{0:X4}\u{1:X4}", (uint)input[0], (uint)input[1]);
- string retVal = encoder.JavaScriptStringEncode(input);
- Assert.Equal(expected, retVal);
- }
- }
-
- [Fact]
- public void JavaScriptStringEncode_BadSurrogates_ReturnsUnicodeReplacementChar()
- {
- // Arrange
- JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeRanges.All); // allow all codepoints
-
- // "abcde"
- const string input = "a\uD800b\uDFFFc\uDFFF\uD800d\uDFFF\uD800\uDFFFe\uD800";
- const string expected = "a\uFFFDb\uFFFDc\uFFFD\uFFFDd\uFFFD\\uD800\\uDFFFe\uFFFD"; // 'D800' 'DFFF' was preserved since it's valid
-
- // Act
- string retVal = encoder.JavaScriptStringEncode(input);
-
- // Assert
- Assert.Equal(expected, retVal);
- }
-
- [Fact]
- public void JavaScriptStringEncode_EmptyStringInput_ReturnsEmptyString()
- {
- // Arrange
- JavaScriptStringEncoder encoder = new JavaScriptStringEncoder();
-
- // Act & assert
- Assert.Equal("", encoder.JavaScriptStringEncode(""));
- }
-
- [Fact]
- public void JavaScriptStringEncode_InputDoesNotRequireEncoding_ReturnsOriginalStringInstance()
- {
- // Arrange
- JavaScriptStringEncoder encoder = new JavaScriptStringEncoder();
- string input = "Hello, there!";
-
- // Act & assert
- Assert.Same(input, encoder.JavaScriptStringEncode(input));
- }
-
- [Fact]
- public void JavaScriptStringEncode_NullInput_ReturnsNull()
- {
- // Arrange
- JavaScriptStringEncoder encoder = new JavaScriptStringEncoder();
-
- // Act & assert
- Assert.Null(encoder.JavaScriptStringEncode(null));
- }
-
- [Fact]
- public void JavaScriptStringEncode_WithCharsRequiringEncodingAtBeginning()
- {
- Assert.Equal(@"\u0026Hello, there!", new JavaScriptStringEncoder().JavaScriptStringEncode("&Hello, there!"));
- }
-
- [Fact]
- public void JavaScriptStringEncode_WithCharsRequiringEncodingAtEnd()
- {
- Assert.Equal(@"Hello, there!\u0026", new JavaScriptStringEncoder().JavaScriptStringEncode("Hello, there!&"));
- }
-
- [Fact]
- public void JavaScriptStringEncode_WithCharsRequiringEncodingInMiddle()
- {
- Assert.Equal(@"Hello, \u0026there!", new JavaScriptStringEncoder().JavaScriptStringEncode("Hello, &there!"));
- }
-
- [Fact]
- public void JavaScriptStringEncode_WithCharsRequiringEncodingInterspersed()
- {
- Assert.Equal(@"Hello, \u003Cthere\u003E!", new JavaScriptStringEncoder().JavaScriptStringEncode("Hello, !"));
- }
-
- [Fact]
- public void JavaScriptStringEncode_CharArray()
- {
- // Arrange
- JavaScriptStringEncoder encoder = new JavaScriptStringEncoder();
- var output = new StringWriter();
-
- // Act
- encoder.JavaScriptStringEncode("Hello+world!".ToCharArray(), 3, 5, output);
-
- // Assert
- Assert.Equal(@"lo\u002Bwo", output.ToString());
- }
-
- [Fact]
- public void JavaScriptStringEncode_StringSubstring()
- {
- // Arrange
- JavaScriptStringEncoder encoder = new JavaScriptStringEncoder();
- var output = new StringWriter();
-
- // Act
- encoder.JavaScriptStringEncode("Hello+world!", 3, 5, output);
-
- // Assert
- Assert.Equal(@"lo\u002Bwo", output.ToString());
- }
-
- [Theory]
- [InlineData("\"", @"\u0022")]
- [InlineData("'", @"\u0027")]
- public void JavaScriptStringEncode_Quotes(string input, string expected)
- {
- // Per the design document, we provide additional defense-in-depth
- // against breaking out of HTML attributes by having the encoders
- // never emit the ' or " characters. This means that we want to
- // \u-escape these characters instead of using \' and \".
-
- // Arrange
- JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeRanges.All);
-
- // Act
- string retVal = encoder.JavaScriptStringEncode(input);
-
- // Assert
- Assert.Equal(expected, retVal);
- }
-
- [Fact]
- public void JavaScriptStringEncode_DoesNotOutputHtmlSensitiveCharacters()
- {
- // Per the design document, we provide additional defense-in-depth
- // by never emitting HTML-sensitive characters unescaped.
-
- // Arrange
- JavaScriptStringEncoder javaScriptStringEncoder = new JavaScriptStringEncoder(UnicodeRanges.All);
- HtmlEncoder htmlEncoder = new HtmlEncoder(UnicodeRanges.All);
-
- // Act & assert
- for (int i = 0; i <= 0x10FFFF; i++)
- {
- if (IsSurrogateCodePoint(i))
- {
- continue; // surrogates don't matter here
- }
-
- string javaScriptStringEncoded = javaScriptStringEncoder.JavaScriptStringEncode(Char.ConvertFromUtf32(i));
- string thenHtmlEncoded = htmlEncoder.HtmlEncode(javaScriptStringEncoded);
- Assert.Equal(javaScriptStringEncoded, thenHtmlEncoded); // should have contained no HTML-sensitive characters
- }
- }
-
- private static bool IsSurrogateCodePoint(int codePoint)
- {
- return (0xD800 <= codePoint && codePoint <= 0xDFFF);
- }
- }
-}
diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/ParsedEntity.cs b/test/Microsoft.Extensions.WebEncoders.Tests/ParsedEntity.cs
deleted file mode 100644
index b52ee7f04f..0000000000
--- a/test/Microsoft.Extensions.WebEncoders.Tests/ParsedEntity.cs
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-using Newtonsoft.Json;
-
-namespace Microsoft.Extensions.WebEncoders
-{
- internal sealed class ParsedEntity
- {
- [JsonProperty("codepoints")]
- public int[] Codepoints { get; set; }
-
- [JsonProperty("characters")]
- public string DecodedString { get; set; }
- }
-}
diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeEncoderBaseTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeEncoderBaseTests.cs
deleted file mode 100644
index 1c088e8b16..0000000000
--- a/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeEncoderBaseTests.cs
+++ /dev/null
@@ -1,406 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-using System.Collections.Generic;
-using System.Globalization;
-using System.IO;
-using Xunit;
-
-namespace Microsoft.Extensions.WebEncoders
-{
- public class UnicodeEncoderBaseTests
- {
- [Fact]
- public void Ctor_WithCustomFilters()
- {
- // Arrange
- var filter = new CodePointFilter().AllowChars("ab").AllowChars('\0', '&', '\uFFFF', 'd');
- UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(filter);
-
- // Act & assert
- Assert.Equal("a", encoder.Encode("a"));
- Assert.Equal("b", encoder.Encode("b"));
- Assert.Equal("[U+0063]", encoder.Encode("c"));
- Assert.Equal("d", encoder.Encode("d"));
- Assert.Equal("[U+0000]", encoder.Encode("\0")); // we still always encode control chars
- Assert.Equal("[U+0026]", encoder.Encode("&")); // we still always encode HTML-special chars
- Assert.Equal("[U+FFFF]", encoder.Encode("\uFFFF")); // we still always encode non-chars and other forbidden chars
- }
-
- [Fact]
- public void Ctor_WithUnicodeRanges()
- {
- // Arrange
- UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(new CodePointFilter(UnicodeRanges.Latin1Supplement, UnicodeRanges.MiscellaneousSymbols));
-
- // Act & assert
- Assert.Equal("[U+0061]", encoder.Encode("a"));
- Assert.Equal("\u00E9", encoder.Encode("\u00E9" /* LATIN SMALL LETTER E WITH ACUTE */));
- Assert.Equal("\u2601", encoder.Encode("\u2601" /* CLOUD */));
- }
-
- [Fact]
- public void Encode_AllRangesAllowed_StillEncodesForbiddenChars_Simple()
- {
- // Arrange
- UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All);
- const string input = "Hello <>&\'\"+ there!";
- const string expected = "Hello [U+003C][U+003E][U+0026][U+0027][U+0022][U+002B] there!";
-
- // Act & assert
- Assert.Equal(expected, encoder.Encode(input));
- }
-
- [Fact]
- public void Encode_AllRangesAllowed_StillEncodesForbiddenChars_Extended()
- {
- // Arrange
- UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All);
-
- // Act & assert - BMP chars
- for (int i = 0; i <= 0xFFFF; i++)
- {
- string input = new String((char)i, 1);
- string expected;
- if (IsSurrogateCodePoint(i))
- {
- expected = "\uFFFD"; // unpaired surrogate -> Unicode replacement char
- }
- else
- {
- bool mustEncode = false;
- switch (i)
- {
- case '<':
- case '>':
- case '&':
- case '\"':
- case '\'':
- case '+':
- mustEncode = true;
- break;
- }
-
- if (i <= 0x001F || (0x007F <= i && i <= 0x9F))
- {
- mustEncode = true; // control char
- }
- else if (!UnicodeHelpers.IsCharacterDefined((char)i))
- {
- mustEncode = true; // undefined (or otherwise disallowed) char
- }
-
- if (mustEncode)
- {
- expected = String.Format(CultureInfo.InvariantCulture, "[U+{0:X4}]", i);
- }
- else
- {
- expected = input; // no encoding
- }
- }
-
- string retVal = encoder.Encode(input);
- Assert.Equal(expected, retVal);
- }
-
- // Act & assert - astral chars
- for (int i = 0x10000; i <= 0x10FFFF; i++)
- {
- string input = Char.ConvertFromUtf32(i);
- string expected = String.Format(CultureInfo.InvariantCulture, "[U+{0:X}]", i);
- string retVal = encoder.Encode(input);
- Assert.Equal(expected, retVal);
- }
- }
-
- [Fact]
- public void Encode_BadSurrogates_ReturnsUnicodeReplacementChar()
- {
- // Arrange
- UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); // allow all codepoints
-
- // "abcde"
- const string input = "a\uD800b\uDFFFc\uDFFF\uD800d\uDFFF\uD800\uDFFFe\uD800";
- const string expected = "a\uFFFDb\uFFFDc\uFFFD\uFFFDd\uFFFD[U+103FF]e\uFFFD";
-
- // Act
- string retVal = encoder.Encode(input);
-
- // Assert
- Assert.Equal(expected, retVal);
- }
-
- [Fact]
- public void Encode_EmptyStringInput_ReturnsEmptyString()
- {
- // Arrange
- UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All);
-
- // Act & assert
- Assert.Equal("", encoder.Encode(""));
- }
-
- [Fact]
- public void Encode_InputDoesNotRequireEncoding_ReturnsOriginalStringInstance()
- {
- // Arrange
- UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All);
- string input = "Hello, there!";
-
- // Act & assert
- Assert.Same(input, encoder.Encode(input));
- }
-
- [Fact]
- public void Encode_NullInput_ReturnsNull()
- {
- // Arrange
- UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All);
-
- // Act & assert
- Assert.Null(encoder.Encode(null));
- }
-
- [Fact]
- public void Encode_WithCharsRequiringEncodingAtBeginning()
- {
- Assert.Equal("[U+0026]Hello, there!", new CustomUnicodeEncoderBase(UnicodeRanges.All).Encode("&Hello, there!"));
- }
-
- [Fact]
- public void Encode_WithCharsRequiringEncodingAtEnd()
- {
- Assert.Equal("Hello, there![U+0026]", new CustomUnicodeEncoderBase(UnicodeRanges.All).Encode("Hello, there!&"));
- }
-
- [Fact]
- public void Encode_WithCharsRequiringEncodingInMiddle()
- {
- Assert.Equal("Hello, [U+0026]there!", new CustomUnicodeEncoderBase(UnicodeRanges.All).Encode("Hello, &there!"));
- }
-
- [Fact]
- public void Encode_WithCharsRequiringEncodingInterspersed()
- {
- Assert.Equal("Hello, [U+003C]there[U+003E]!", new CustomUnicodeEncoderBase(UnicodeRanges.All).Encode("Hello, !"));
- }
-
- [Fact]
- public void Encode_CharArray_ParameterChecking_NegativeTestCases()
- {
- // Arrange
- CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase();
-
- // Act & assert
- Assert.Throws(() => encoder.Encode((char[])null, 0, 0, new StringWriter()));
- Assert.Throws(() => encoder.Encode("abc".ToCharArray(), 0, 3, null));
- Assert.Throws(() => encoder.Encode("abc".ToCharArray(), -1, 2, new StringWriter()));
- Assert.Throws(() => encoder.Encode("abc".ToCharArray(), 2, 2, new StringWriter()));
- Assert.Throws(() => encoder.Encode("abc".ToCharArray(), 4, 0, new StringWriter()));
- Assert.Throws(() => encoder.Encode("abc".ToCharArray(), 2, -1, new StringWriter()));
- Assert.Throws(() => encoder.Encode("abc".ToCharArray(), 1, 3, new StringWriter()));
- }
-
- [Fact]
- public void Encode_CharArray_ZeroCount_DoesNotCallIntoTextWriter()
- {
- // Arrange
- var encoder = new CustomUnicodeEncoderBase();
- var output = new StringWriter();
- output.Dispose(); // Throws ODE if written to.
-
- // Act
- encoder.Encode("abc".ToCharArray(), 2, 0, output);
-
- // Assert
- // If we got this far (without TextWriter throwing), success!
- }
-
- [Fact]
- public void Encode_CharArray_AllCharsValid()
- {
- // Arrange
- CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All);
- StringWriter output = new StringWriter();
-
- // Act
- encoder.Encode("abc&xyz".ToCharArray(), 4, 2, output);
-
- // Assert
- Assert.Equal("xy", output.ToString());
- }
-
- [Fact]
- public void Encode_CharArray_AllCharsInvalid()
- {
- // Arrange
- CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase();
- StringWriter output = new StringWriter();
-
- // Act
- encoder.Encode("abc&xyz".ToCharArray(), 4, 2, output);
-
- // Assert
- Assert.Equal("[U+0078][U+0079]", output.ToString());
- }
-
- [Fact]
- public void Encode_CharArray_SomeCharsValid()
- {
- // Arrange
- CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All);
- StringWriter output = new StringWriter();
-
- // Act
- encoder.Encode("abc&xyz".ToCharArray(), 2, 3, output);
-
- // Assert
- Assert.Equal("c[U+0026]x", output.ToString());
- }
-
- [Fact]
- public void Encode_StringSubstring_ParameterChecking_NegativeTestCases()
- {
- // Arrange
- CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase();
-
- // Act & assert
- Assert.Throws(() => encoder.Encode((string)null, 0, 0, new StringWriter()));
- Assert.Throws(() => encoder.Encode("abc", 0, 3, null));
- Assert.Throws(() => encoder.Encode("abc", -1, 2, new StringWriter()));
- Assert.Throws(() => encoder.Encode("abc", 2, 2, new StringWriter()));
- Assert.Throws(() => encoder.Encode("abc", 4, 0, new StringWriter()));
- Assert.Throws(() => encoder.Encode("abc", 2, -1, new StringWriter()));
- Assert.Throws(() => encoder.Encode("abc", 1, 3, new StringWriter()));
- }
-
- [Fact]
- public void Encode_StringSubstring_ZeroCount_DoesNotCallIntoTextWriter()
- {
- // Arrange
- var encoder = new CustomUnicodeEncoderBase();
- var output = new StringWriter();
- output.Dispose(); // Throws ODE if written to.
-
- // Act
- encoder.Encode("abc", 2, 0, output);
-
- // Assert
- // If we got this far (without TextWriter throwing), success!
- }
-
- [Fact]
- public void Encode_StringSubstring_AllCharsValid()
- {
- // Arrange
- CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All);
- StringWriter output = new StringWriter();
-
- // Act
- encoder.Encode("abc&xyz", 4, 2, output);
-
- // Assert
- Assert.Equal("xy", output.ToString());
- }
-
- [Fact]
- public void Encode_StringSubstring_EntireString_AllCharsValid_ForwardDirectlyToOutput()
- {
- // Arrange
- CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All);
- StringWriter output = new StringWriter();
-
- // Act
- encoder.Encode("abc", 0, 3, output);
-
- // Assert
- Assert.Equal("abc", output.ToString());
- }
-
- [Fact]
- public void Encode_StringSubstring_AllCharsInvalid()
- {
- // Arrange
- CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase();
- StringWriter output = new StringWriter();
-
- // Act
- encoder.Encode("abc&xyz", 4, 2, output);
-
- // Assert
- Assert.Equal("[U+0078][U+0079]", output.ToString());
- }
-
- [Fact]
- public void Encode_StringSubstring_SomeCharsValid()
- {
- // Arrange
- CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All);
- StringWriter output = new StringWriter();
-
- // Act
- encoder.Encode("abc&xyz", 2, 3, output);
-
- // Assert
- Assert.Equal("c[U+0026]x", output.ToString());
- }
-
- [Fact]
- public void Encode_StringSubstring_EntireString_SomeCharsValid()
- {
- // Arrange
- CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All);
- StringWriter output = new StringWriter();
-
- // Act
- const string input = "abc&xyz";
- encoder.Encode(input, 0, input.Length, output);
-
- // Assert
- Assert.Equal("abc[U+0026]xyz", output.ToString());
- }
-
- private static bool IsSurrogateCodePoint(int codePoint)
- {
- return (0xD800 <= codePoint && codePoint <= 0xDFFF);
- }
-
- private sealed class CustomCodePointFilter : ICodePointFilter
- {
- private readonly int[] _allowedCodePoints;
-
- public CustomCodePointFilter(params int[] allowedCodePoints)
- {
- _allowedCodePoints = allowedCodePoints;
- }
-
- public IEnumerable GetAllowedCodePoints()
- {
- return _allowedCodePoints;
- }
- }
-
- private sealed class CustomUnicodeEncoderBase : UnicodeEncoderBase
- {
- // We pass a (known bad) value of 1 for 'max output chars per input char',
- // which also tests that the code behaves properly even if the original
- // estimate is incorrect.
- public CustomUnicodeEncoderBase(CodePointFilter filter)
- : base(filter, maxOutputCharsPerInputChar: 1)
- {
- }
-
- public CustomUnicodeEncoderBase(params UnicodeRange[] allowedRanges)
- : this(new CodePointFilter(allowedRanges))
- {
- }
-
- protected override void WriteEncodedScalar(ref Writer writer, uint value)
- {
- writer.Write(String.Format(CultureInfo.InvariantCulture, "[U+{0:X4}]", value));
- }
- }
- }
-}
diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeHelpersTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeHelpersTests.cs
deleted file mode 100644
index 57ba091465..0000000000
--- a/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeHelpersTests.cs
+++ /dev/null
@@ -1,222 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-using System.Collections.Generic;
-using System.Globalization;
-using System.IO;
-using System.Linq;
-using System.Reflection;
-using System.Text;
-using Xunit;
-
-namespace Microsoft.Extensions.WebEncoders
-{
- public unsafe class UnicodeHelpersTests
- {
- private const int UnicodeReplacementChar = '\uFFFD';
-
- private static readonly UTF8Encoding _utf8EncodingThrowOnInvalidBytes = new UTF8Encoding(encoderShouldEmitUTF8Identifier: false, throwOnInvalidBytes: true);
-
- [Fact]
- public void GetDefinedCharacterBitmap_ReturnsSingletonInstance()
- {
- // Act
- uint[] retVal1 = UnicodeHelpers.GetDefinedCharacterBitmap();
- uint[] retVal2 = UnicodeHelpers.GetDefinedCharacterBitmap();
-
- // Assert
- Assert.Same(retVal1, retVal2);
- }
-
- public static TheoryData Utf16ScalarValues
- {
- get
- {
- var dataset = new TheoryData();
- dataset.Add(1, "a", (int)'a'); // normal BMP char, end of string
- dataset.Add(2, "ab", (int)'a'); // normal BMP char, not end of string
- dataset.Add(3, "\uDFFF", UnicodeReplacementChar); // trailing surrogate, end of string
- dataset.Add(4, "\uDFFFx", UnicodeReplacementChar); // trailing surrogate, not end of string
- dataset.Add(5, "\uD800", UnicodeReplacementChar); // leading surrogate, end of string
- dataset.Add(6, "\uD800x", UnicodeReplacementChar); // leading surrogate, not end of string, followed by non-surrogate
- dataset.Add(7, "\uD800\uD800", UnicodeReplacementChar); // leading surrogate, not end of string, followed by leading surrogate
- dataset.Add(8, "\uD800\uDFFF", 0x103FF); // leading surrogate, not end of string, followed by trailing surrogate
-
- return dataset;
- }
- }
-
- [Theory]
- [MemberData(nameof(Utf16ScalarValues))]
- public void GetScalarValueFromUtf16(int unused, string input, int expectedResult)
- {
- // The 'unused' parameter exists because the xunit runner can't distinguish
- // the individual malformed data test cases from each other without this
- // additional identifier.
-
- fixed (char* pInput = input)
- {
- Assert.Equal(expectedResult, UnicodeHelpers.GetScalarValueFromUtf16(pInput, endOfString: (input.Length == 1)));
- }
- }
-
- [Fact]
- public void GetUtf8RepresentationForScalarValue()
- {
- for (int i = 0; i <= 0x10FFFF; i++)
- {
- if (i <= 0xFFFF && Char.IsSurrogate((char)i))
- {
- continue; // no surrogates
- }
-
- // Arrange
- byte[] expectedUtf8Bytes = _utf8EncodingThrowOnInvalidBytes.GetBytes(Char.ConvertFromUtf32(i));
-
- // Act
- List actualUtf8Bytes = new List(4);
- uint asUtf8 = (uint)UnicodeHelpers.GetUtf8RepresentationForScalarValue((uint)i);
- do
- {
- actualUtf8Bytes.Add((byte)asUtf8);
- } while ((asUtf8 >>= 8) != 0);
-
- // Assert
- Assert.Equal(expectedUtf8Bytes, actualUtf8Bytes);
- }
- }
-
- [Fact]
- public void IsCharacterDefined()
- {
- // Arrange
- bool[] definedChars = ReadListOfDefinedCharacters();
- List errors = new List();
-
- // Act & assert
- for (int i = 0; i <= Char.MaxValue; i++)
- {
- bool expected = definedChars[i];
- bool actual = UnicodeHelpers.IsCharacterDefined((char)i);
- if (expected != actual)
- {
- errors.Add($"Character U+{i:X4}: expected = {expected}, actual = {actual}");
- }
- }
-
- if (errors.Count > 0)
- {
- Assert.True(false, String.Join(Environment.NewLine, errors));
- }
- }
-
- private static bool[] ReadListOfDefinedCharacters()
- {
- HashSet allowedCategories = new HashSet();
-
- // Letters
- allowedCategories.Add("Lu");
- allowedCategories.Add("Ll");
- allowedCategories.Add("Lt");
- allowedCategories.Add("Lm");
- allowedCategories.Add("Lo");
-
- // Marks
- allowedCategories.Add("Mn");
- allowedCategories.Add("Mc");
- allowedCategories.Add("Me");
-
- // Numbers
- allowedCategories.Add("Nd");
- allowedCategories.Add("Nl");
- allowedCategories.Add("No");
-
- // Punctuation
- allowedCategories.Add("Pc");
- allowedCategories.Add("Pd");
- allowedCategories.Add("Ps");
- allowedCategories.Add("Pe");
- allowedCategories.Add("Pi");
- allowedCategories.Add("Pf");
- allowedCategories.Add("Po");
-
- // Symbols
- allowedCategories.Add("Sm");
- allowedCategories.Add("Sc");
- allowedCategories.Add("Sk");
- allowedCategories.Add("So");
-
- // Separators
- // With the exception of U+0020 SPACE, these aren't allowed
-
- // Other
- // We only allow one category of 'other' characters
- allowedCategories.Add("Cf");
-
- HashSet seenCategories = new HashSet();
-
- bool[] retVal = new bool[0x10000];
-
- var assembly = typeof(UnicodeHelpersTests).GetTypeInfo().Assembly;
- var resourceName = assembly.GetName().Name + ".UnicodeData.txt";
- string[] allLines = new StreamReader(assembly.GetManifestResourceStream(resourceName)).ReadAllLines();
-
- foreach (string line in allLines)
- {
- string[] splitLine = line.Split(';');
- uint codePoint = UInt32.Parse(splitLine[0], NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture);
- string name = splitLine[1];
- if (codePoint >= retVal.Length)
- {
- continue; // don't care about supplementary chars
- }
-
- if (name.EndsWith(", First>", StringComparison.Ordinal) || name.EndsWith(", Last>", StringComparison.Ordinal))
- {
- // ignore spans - we'll handle them separately
- continue;
- }
-
- if (codePoint == (uint)' ')
- {
- retVal[codePoint] = true; // we allow U+0020 SPACE as our only valid Zs (whitespace) char
- }
- else
- {
- string category = splitLine[2];
- if (allowedCategories.Contains(category))
- {
- retVal[codePoint] = true; // chars in this category are allowable
- seenCategories.Add(category);
- }
- }
- }
-
- // Handle known spans from Unicode 8.0's UnicodeData.txt
-
- // CJK Ideograph Extension A
- for (int i = '\u3400'; i <= '\u4DB5'; i++)
- {
- retVal[i] = true;
- }
- // CJK Ideograph
- for (int i = '\u4E00'; i <= '\u9FD5'; i++)
- {
- retVal[i] = true;
- }
- // Hangul Syllable
- for (int i = '\uAC00'; i <= '\uD7A3'; i++)
- {
- retVal[i] = true;
- }
-
- // Finally, we need to make sure we've seen every category which contains
- // allowed characters. This provides extra defense against having a typo
- // in the list of categories.
- Assert.Equal(allowedCategories.OrderBy(c => c), seenCategories.OrderBy(c => c));
-
- return retVal;
- }
- }
-}
diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeRangeTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeRangeTests.cs
deleted file mode 100644
index dd9302f2a1..0000000000
--- a/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeRangeTests.cs
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-using Xunit;
-
-namespace Microsoft.Extensions.WebEncoders
-{
- public class UnicodeRangeTests
- {
- [Theory]
- [InlineData(-1, 16)]
- [InlineData(0x10000, 16)]
- public void Ctor_FailureCase_FirstCodePoint(int firstCodePoint, int rangeSize)
- {
- var ex = Assert.Throws(() => new UnicodeRange(firstCodePoint, rangeSize));
- Assert.Equal("firstCodePoint", ex.ParamName);
- }
-
- [Theory]
- [InlineData(0x0100, -1)]
- [InlineData(0x0100, 0x10000)]
- public void Ctor_FailureCase_RangeSize(int firstCodePoint, int rangeSize)
- {
- var ex = Assert.Throws(() => new UnicodeRange(firstCodePoint, rangeSize));
- Assert.Equal("rangeSize", ex.ParamName);
- }
-
- [Fact]
- public void Ctor_SuccessCase()
- {
- // Act
- var range = new UnicodeRange(0x0100, 128); // Latin Extended-A
-
- // Assert
- Assert.Equal(0x0100, range.FirstCodePoint);
- Assert.Equal(128, range.RangeSize);
- }
-
- [Fact]
- public void FromSpan_FailureCase()
- {
- var ex = Assert.Throws(() => UnicodeRange.FromSpan('\u0020', '\u0010'));
- Assert.Equal("lastChar", ex.ParamName);
- }
-
- [Fact]
- public void FromSpan_SuccessCase()
- {
- // Act
- var range = UnicodeRange.FromSpan('\u0180', '\u024F'); // Latin Extended-B
-
- // Assert
- Assert.Equal(0x0180, range.FirstCodePoint);
- Assert.Equal(208, range.RangeSize);
- }
-
- [Fact]
- public void FromSpan_SuccessCase_All()
- {
- // Act
- var range = UnicodeRange.FromSpan('\u0000', '\uFFFF');
-
- // Assert
- Assert.Equal(0, range.FirstCodePoint);
- Assert.Equal(0x10000, range.RangeSize);
- }
- }
-}
diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeRangesTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeRangesTests.cs
deleted file mode 100644
index ddb4b1c646..0000000000
--- a/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeRangesTests.cs
+++ /dev/null
@@ -1,211 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-using System.Reflection;
-using Xunit;
-
-namespace Microsoft.Extensions.WebEncoders
-{
- public class UnicodeRangesTests
- {
- [Fact]
- public void Range_None()
- {
- UnicodeRange range = UnicodeRanges.None;
- Assert.NotNull(range);
-
- // Test 1: the range should be empty
- Assert.Equal(0, range.FirstCodePoint);
- Assert.Equal(0, range.RangeSize);
-
- // Test 2: calling the property multiple times should cache and return the same range instance
- UnicodeRange range2 = UnicodeRanges.None;
- Assert.Same(range, range2);
- }
-
- [Fact]
- public void Range_All()
- {
- Range_Unicode('\u0000', '\uFFFF', nameof(UnicodeRanges.All));
- }
-
- [Theory]
- [InlineData('\u0000', '\u007F', nameof(UnicodeRanges.BasicLatin))]
- [InlineData('\u0080', '\u00FF', nameof(UnicodeRanges.Latin1Supplement))]
- [InlineData('\u0100', '\u017F', nameof(UnicodeRanges.LatinExtendedA))]
- [InlineData('\u0180', '\u024F', nameof(UnicodeRanges.LatinExtendedB))]
- [InlineData('\u0250', '\u02AF', nameof(UnicodeRanges.IPAExtensions))]
- [InlineData('\u02B0', '\u02FF', nameof(UnicodeRanges.SpacingModifierLetters))]
- [InlineData('\u0300', '\u036F', nameof(UnicodeRanges.CombiningDiacriticalMarks))]
- [InlineData('\u0370', '\u03FF', nameof(UnicodeRanges.GreekandCoptic))]
- [InlineData('\u0400', '\u04FF', nameof(UnicodeRanges.Cyrillic))]
- [InlineData('\u0500', '\u052F', nameof(UnicodeRanges.CyrillicSupplement))]
- [InlineData('\u0530', '\u058F', nameof(UnicodeRanges.Armenian))]
- [InlineData('\u0590', '\u05FF', nameof(UnicodeRanges.Hebrew))]
- [InlineData('\u0600', '\u06FF', nameof(UnicodeRanges.Arabic))]
- [InlineData('\u0700', '\u074F', nameof(UnicodeRanges.Syriac))]
- [InlineData('\u0750', '\u077F', nameof(UnicodeRanges.ArabicSupplement))]
- [InlineData('\u0780', '\u07BF', nameof(UnicodeRanges.Thaana))]
- [InlineData('\u07C0', '\u07FF', nameof(UnicodeRanges.NKo))]
- [InlineData('\u0800', '\u083F', nameof(UnicodeRanges.Samaritan))]
- [InlineData('\u0840', '\u085F', nameof(UnicodeRanges.Mandaic))]
- [InlineData('\u08A0', '\u08FF', nameof(UnicodeRanges.ArabicExtendedA))]
- [InlineData('\u0900', '\u097F', nameof(UnicodeRanges.Devanagari))]
- [InlineData('\u0980', '\u09FF', nameof(UnicodeRanges.Bengali))]
- [InlineData('\u0A00', '\u0A7F', nameof(UnicodeRanges.Gurmukhi))]
- [InlineData('\u0A80', '\u0AFF', nameof(UnicodeRanges.Gujarati))]
- [InlineData('\u0B00', '\u0B7F', nameof(UnicodeRanges.Oriya))]
- [InlineData('\u0B80', '\u0BFF', nameof(UnicodeRanges.Tamil))]
- [InlineData('\u0C00', '\u0C7F', nameof(UnicodeRanges.Telugu))]
- [InlineData('\u0C80', '\u0CFF', nameof(UnicodeRanges.Kannada))]
- [InlineData('\u0D00', '\u0D7F', nameof(UnicodeRanges.Malayalam))]
- [InlineData('\u0D80', '\u0DFF', nameof(UnicodeRanges.Sinhala))]
- [InlineData('\u0E00', '\u0E7F', nameof(UnicodeRanges.Thai))]
- [InlineData('\u0E80', '\u0EFF', nameof(UnicodeRanges.Lao))]
- [InlineData('\u0F00', '\u0FFF', nameof(UnicodeRanges.Tibetan))]
- [InlineData('\u1000', '\u109F', nameof(UnicodeRanges.Myanmar))]
- [InlineData('\u10A0', '\u10FF', nameof(UnicodeRanges.Georgian))]
- [InlineData('\u1100', '\u11FF', nameof(UnicodeRanges.HangulJamo))]
- [InlineData('\u1200', '\u137F', nameof(UnicodeRanges.Ethiopic))]
- [InlineData('\u1380', '\u139F', nameof(UnicodeRanges.EthiopicSupplement))]
- [InlineData('\u13A0', '\u13FF', nameof(UnicodeRanges.Cherokee))]
- [InlineData('\u1400', '\u167F', nameof(UnicodeRanges.UnifiedCanadianAboriginalSyllabics))]
- [InlineData('\u1680', '\u169F', nameof(UnicodeRanges.Ogham))]
- [InlineData('\u16A0', '\u16FF', nameof(UnicodeRanges.Runic))]
- [InlineData('\u1700', '\u171F', nameof(UnicodeRanges.Tagalog))]
- [InlineData('\u1720', '\u173F', nameof(UnicodeRanges.Hanunoo))]
- [InlineData('\u1740', '\u175F', nameof(UnicodeRanges.Buhid))]
- [InlineData('\u1760', '\u177F', nameof(UnicodeRanges.Tagbanwa))]
- [InlineData('\u1780', '\u17FF', nameof(UnicodeRanges.Khmer))]
- [InlineData('\u1800', '\u18AF', nameof(UnicodeRanges.Mongolian))]
- [InlineData('\u18B0', '\u18FF', nameof(UnicodeRanges.UnifiedCanadianAboriginalSyllabicsExtended))]
- [InlineData('\u1900', '\u194F', nameof(UnicodeRanges.Limbu))]
- [InlineData('\u1950', '\u197F', nameof(UnicodeRanges.TaiLe))]
- [InlineData('\u1980', '\u19DF', nameof(UnicodeRanges.NewTaiLue))]
- [InlineData('\u19E0', '\u19FF', nameof(UnicodeRanges.KhmerSymbols))]
- [InlineData('\u1A00', '\u1A1F', nameof(UnicodeRanges.Buginese))]
- [InlineData('\u1A20', '\u1AAF', nameof(UnicodeRanges.TaiTham))]
- [InlineData('\u1AB0', '\u1AFF', nameof(UnicodeRanges.CombiningDiacriticalMarksExtended))]
- [InlineData('\u1B00', '\u1B7F', nameof(UnicodeRanges.Balinese))]
- [InlineData('\u1B80', '\u1BBF', nameof(UnicodeRanges.Sundanese))]
- [InlineData('\u1BC0', '\u1BFF', nameof(UnicodeRanges.Batak))]
- [InlineData('\u1C00', '\u1C4F', nameof(UnicodeRanges.Lepcha))]
- [InlineData('\u1C50', '\u1C7F', nameof(UnicodeRanges.OlChiki))]
- [InlineData('\u1CC0', '\u1CCF', nameof(UnicodeRanges.SundaneseSupplement))]
- [InlineData('\u1CD0', '\u1CFF', nameof(UnicodeRanges.VedicExtensions))]
- [InlineData('\u1D00', '\u1D7F', nameof(UnicodeRanges.PhoneticExtensions))]
- [InlineData('\u1D80', '\u1DBF', nameof(UnicodeRanges.PhoneticExtensionsSupplement))]
- [InlineData('\u1DC0', '\u1DFF', nameof(UnicodeRanges.CombiningDiacriticalMarksSupplement))]
- [InlineData('\u1E00', '\u1EFF', nameof(UnicodeRanges.LatinExtendedAdditional))]
- [InlineData('\u1F00', '\u1FFF', nameof(UnicodeRanges.GreekExtended))]
- [InlineData('\u2000', '\u206F', nameof(UnicodeRanges.GeneralPunctuation))]
- [InlineData('\u2070', '\u209F', nameof(UnicodeRanges.SuperscriptsandSubscripts))]
- [InlineData('\u20A0', '\u20CF', nameof(UnicodeRanges.CurrencySymbols))]
- [InlineData('\u20D0', '\u20FF', nameof(UnicodeRanges.CombiningDiacriticalMarksforSymbols))]
- [InlineData('\u2100', '\u214F', nameof(UnicodeRanges.LetterlikeSymbols))]
- [InlineData('\u2150', '\u218F', nameof(UnicodeRanges.NumberForms))]
- [InlineData('\u2190', '\u21FF', nameof(UnicodeRanges.Arrows))]
- [InlineData('\u2200', '\u22FF', nameof(UnicodeRanges.MathematicalOperators))]
- [InlineData('\u2300', '\u23FF', nameof(UnicodeRanges.MiscellaneousTechnical))]
- [InlineData('\u2400', '\u243F', nameof(UnicodeRanges.ControlPictures))]
- [InlineData('\u2440', '\u245F', nameof(UnicodeRanges.OpticalCharacterRecognition))]
- [InlineData('\u2460', '\u24FF', nameof(UnicodeRanges.EnclosedAlphanumerics))]
- [InlineData('\u2500', '\u257F', nameof(UnicodeRanges.BoxDrawing))]
- [InlineData('\u2580', '\u259F', nameof(UnicodeRanges.BlockElements))]
- [InlineData('\u25A0', '\u25FF', nameof(UnicodeRanges.GeometricShapes))]
- [InlineData('\u2600', '\u26FF', nameof(UnicodeRanges.MiscellaneousSymbols))]
- [InlineData('\u2700', '\u27BF', nameof(UnicodeRanges.Dingbats))]
- [InlineData('\u27C0', '\u27EF', nameof(UnicodeRanges.MiscellaneousMathematicalSymbolsA))]
- [InlineData('\u27F0', '\u27FF', nameof(UnicodeRanges.SupplementalArrowsA))]
- [InlineData('\u2800', '\u28FF', nameof(UnicodeRanges.BraillePatterns))]
- [InlineData('\u2900', '\u297F', nameof(UnicodeRanges.SupplementalArrowsB))]
- [InlineData('\u2980', '\u29FF', nameof(UnicodeRanges.MiscellaneousMathematicalSymbolsB))]
- [InlineData('\u2A00', '\u2AFF', nameof(UnicodeRanges.SupplementalMathematicalOperators))]
- [InlineData('\u2B00', '\u2BFF', nameof(UnicodeRanges.MiscellaneousSymbolsandArrows))]
- [InlineData('\u2C00', '\u2C5F', nameof(UnicodeRanges.Glagolitic))]
- [InlineData('\u2C60', '\u2C7F', nameof(UnicodeRanges.LatinExtendedC))]
- [InlineData('\u2C80', '\u2CFF', nameof(UnicodeRanges.Coptic))]
- [InlineData('\u2D00', '\u2D2F', nameof(UnicodeRanges.GeorgianSupplement))]
- [InlineData('\u2D30', '\u2D7F', nameof(UnicodeRanges.Tifinagh))]
- [InlineData('\u2D80', '\u2DDF', nameof(UnicodeRanges.EthiopicExtended))]
- [InlineData('\u2DE0', '\u2DFF', nameof(UnicodeRanges.CyrillicExtendedA))]
- [InlineData('\u2E00', '\u2E7F', nameof(UnicodeRanges.SupplementalPunctuation))]
- [InlineData('\u2E80', '\u2EFF', nameof(UnicodeRanges.CJKRadicalsSupplement))]
- [InlineData('\u2F00', '\u2FDF', nameof(UnicodeRanges.KangxiRadicals))]
- [InlineData('\u2FF0', '\u2FFF', nameof(UnicodeRanges.IdeographicDescriptionCharacters))]
- [InlineData('\u3000', '\u303F', nameof(UnicodeRanges.CJKSymbolsandPunctuation))]
- [InlineData('\u3040', '\u309F', nameof(UnicodeRanges.Hiragana))]
- [InlineData('\u30A0', '\u30FF', nameof(UnicodeRanges.Katakana))]
- [InlineData('\u3100', '\u312F', nameof(UnicodeRanges.Bopomofo))]
- [InlineData('\u3130', '\u318F', nameof(UnicodeRanges.HangulCompatibilityJamo))]
- [InlineData('\u3190', '\u319F', nameof(UnicodeRanges.Kanbun))]
- [InlineData('\u31A0', '\u31BF', nameof(UnicodeRanges.BopomofoExtended))]
- [InlineData('\u31C0', '\u31EF', nameof(UnicodeRanges.CJKStrokes))]
- [InlineData('\u31F0', '\u31FF', nameof(UnicodeRanges.KatakanaPhoneticExtensions))]
- [InlineData('\u3200', '\u32FF', nameof(UnicodeRanges.EnclosedCJKLettersandMonths))]
- [InlineData('\u3300', '\u33FF', nameof(UnicodeRanges.CJKCompatibility))]
- [InlineData('\u3400', '\u4DBF', nameof(UnicodeRanges.CJKUnifiedIdeographsExtensionA))]
- [InlineData('\u4DC0', '\u4DFF', nameof(UnicodeRanges.YijingHexagramSymbols))]
- [InlineData('\u4E00', '\u9FFF', nameof(UnicodeRanges.CJKUnifiedIdeographs))]
- [InlineData('\uA000', '\uA48F', nameof(UnicodeRanges.YiSyllables))]
- [InlineData('\uA490', '\uA4CF', nameof(UnicodeRanges.YiRadicals))]
- [InlineData('\uA4D0', '\uA4FF', nameof(UnicodeRanges.Lisu))]
- [InlineData('\uA500', '\uA63F', nameof(UnicodeRanges.Vai))]
- [InlineData('\uA640', '\uA69F', nameof(UnicodeRanges.CyrillicExtendedB))]
- [InlineData('\uA6A0', '\uA6FF', nameof(UnicodeRanges.Bamum))]
- [InlineData('\uA700', '\uA71F', nameof(UnicodeRanges.ModifierToneLetters))]
- [InlineData('\uA720', '\uA7FF', nameof(UnicodeRanges.LatinExtendedD))]
- [InlineData('\uA800', '\uA82F', nameof(UnicodeRanges.SylotiNagri))]
- [InlineData('\uA830', '\uA83F', nameof(UnicodeRanges.CommonIndicNumberForms))]
- [InlineData('\uA840', '\uA87F', nameof(UnicodeRanges.Phagspa))]
- [InlineData('\uA880', '\uA8DF', nameof(UnicodeRanges.Saurashtra))]
- [InlineData('\uA8E0', '\uA8FF', nameof(UnicodeRanges.DevanagariExtended))]
- [InlineData('\uA900', '\uA92F', nameof(UnicodeRanges.KayahLi))]
- [InlineData('\uA930', '\uA95F', nameof(UnicodeRanges.Rejang))]
- [InlineData('\uA960', '\uA97F', nameof(UnicodeRanges.HangulJamoExtendedA))]
- [InlineData('\uA980', '\uA9DF', nameof(UnicodeRanges.Javanese))]
- [InlineData('\uA9E0', '\uA9FF', nameof(UnicodeRanges.MyanmarExtendedB))]
- [InlineData('\uAA00', '\uAA5F', nameof(UnicodeRanges.Cham))]
- [InlineData('\uAA60', '\uAA7F', nameof(UnicodeRanges.MyanmarExtendedA))]
- [InlineData('\uAA80', '\uAADF', nameof(UnicodeRanges.TaiViet))]
- [InlineData('\uAAE0', '\uAAFF', nameof(UnicodeRanges.MeeteiMayekExtensions))]
- [InlineData('\uAB00', '\uAB2F', nameof(UnicodeRanges.EthiopicExtendedA))]
- [InlineData('\uAB30', '\uAB6F', nameof(UnicodeRanges.LatinExtendedE))]
- [InlineData('\uAB70', '\uABBF', nameof(UnicodeRanges.CherokeeSupplement))]
- [InlineData('\uABC0', '\uABFF', nameof(UnicodeRanges.MeeteiMayek))]
- [InlineData('\uAC00', '\uD7AF', nameof(UnicodeRanges.HangulSyllables))]
- [InlineData('\uD7B0', '\uD7FF', nameof(UnicodeRanges.HangulJamoExtendedB))]
- [InlineData('\uF900', '\uFAFF', nameof(UnicodeRanges.CJKCompatibilityIdeographs))]
- [InlineData('\uFB00', '\uFB4F', nameof(UnicodeRanges.AlphabeticPresentationForms))]
- [InlineData('\uFB50', '\uFDFF', nameof(UnicodeRanges.ArabicPresentationFormsA))]
- [InlineData('\uFE00', '\uFE0F', nameof(UnicodeRanges.VariationSelectors))]
- [InlineData('\uFE10', '\uFE1F', nameof(UnicodeRanges.VerticalForms))]
- [InlineData('\uFE20', '\uFE2F', nameof(UnicodeRanges.CombiningHalfMarks))]
- [InlineData('\uFE30', '\uFE4F', nameof(UnicodeRanges.CJKCompatibilityForms))]
- [InlineData('\uFE50', '\uFE6F', nameof(UnicodeRanges.SmallFormVariants))]
- [InlineData('\uFE70', '\uFEFF', nameof(UnicodeRanges.ArabicPresentationFormsB))]
- [InlineData('\uFF00', '\uFFEF', nameof(UnicodeRanges.HalfwidthandFullwidthForms))]
- [InlineData('\uFFF0', '\uFFFF', nameof(UnicodeRanges.Specials))]
- public void Range_Unicode(char first, char last, string blockName)
- {
- Assert.Equal(0x0, first & 0xF); // first char in any block should be U+nnn0
- Assert.Equal(0xF, last & 0xF); // last char in any block should be U+nnnF
- Assert.True(first < last); // code point ranges should be ordered
-
- var propInfo = typeof(UnicodeRanges).GetProperty(blockName, BindingFlags.Public | BindingFlags.Static);
- Assert.NotNull(propInfo);
-
- UnicodeRange range = (UnicodeRange)propInfo.GetValue(null);
- Assert.NotNull(range);
-
- // Test 1: the range should span the range first..last
- Assert.Equal(first, range.FirstCodePoint);
- Assert.Equal(last, range.FirstCodePoint + range.RangeSize - 1);
-
- // Test 2: calling the property multiple times should cache and return the same range instance
- UnicodeRange range2 = (UnicodeRange)propInfo.GetValue(null);
- Assert.Same(range, range2);
- }
- }
-}
diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/UrlEncoderTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/UrlEncoderTests.cs
deleted file mode 100644
index 2f31e0e16f..0000000000
--- a/test/Microsoft.Extensions.WebEncoders.Tests/UrlEncoderTests.cs
+++ /dev/null
@@ -1,301 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-using System.Globalization;
-using System.IO;
-using System.Linq;
-using System.Text;
-using Xunit;
-
-namespace Microsoft.Extensions.WebEncoders
-{
- public class UrlEncoderTests
- {
- private static UTF8Encoding _utf8EncodingThrowOnInvalidBytes = new UTF8Encoding(encoderShouldEmitUTF8Identifier: false, throwOnInvalidBytes: true);
-
- [Fact]
- public void Ctor_WithCodePointFilter()
- {
- // Arrange
- var filter = new CodePointFilter().AllowChars("ab").AllowChars('\0', '&', '\uFFFF', 'd');
- UrlEncoder encoder = new UrlEncoder(filter);
-
- // Act & assert
- Assert.Equal("a", encoder.UrlEncode("a"));
- Assert.Equal("b", encoder.UrlEncode("b"));
- Assert.Equal("%63", encoder.UrlEncode("c"));
- Assert.Equal("d", encoder.UrlEncode("d"));
- Assert.Equal("%00", encoder.UrlEncode("\0")); // we still always encode control chars
- Assert.Equal("%26", encoder.UrlEncode("&")); // we still always encode HTML-special chars
- Assert.Equal("%EF%BF%BF", encoder.UrlEncode("\uFFFF")); // we still always encode non-chars and other forbidden chars
- }
-
- [Fact]
- public void Ctor_WithUnicodeRanges()
- {
- // Arrange
- UrlEncoder encoder = new UrlEncoder(UnicodeRanges.Latin1Supplement, UnicodeRanges.MiscellaneousSymbols);
-
- // Act & assert
- Assert.Equal("%61", encoder.UrlEncode("a"));
- Assert.Equal("\u00E9", encoder.UrlEncode("\u00E9" /* LATIN SMALL LETTER E WITH ACUTE */));
- Assert.Equal("\u2601", encoder.UrlEncode("\u2601" /* CLOUD */));
- }
-
- [Fact]
- public void Ctor_WithNoParameters_DefaultsToBasicLatin()
- {
- // Arrange
- UrlEncoder encoder = new UrlEncoder();
-
- // Act & assert
- Assert.Equal("a", encoder.UrlEncode("a"));
- Assert.Equal("%C3%A9", encoder.UrlEncode("\u00E9" /* LATIN SMALL LETTER E WITH ACUTE */));
- Assert.Equal("%E2%98%81", encoder.UrlEncode("\u2601" /* CLOUD */));
- }
-
- [Fact]
- public void Default_EquivalentToBasicLatin()
- {
- // Arrange
- UrlEncoder controlEncoder = new UrlEncoder(UnicodeRanges.BasicLatin);
- UrlEncoder testEncoder = UrlEncoder.Default;
-
- // Act & assert
- for (int i = 0; i <= Char.MaxValue; i++)
- {
- if (!IsSurrogateCodePoint(i))
- {
- string input = new String((char)i, 1);
- Assert.Equal(controlEncoder.UrlEncode(input), testEncoder.UrlEncode(input));
- }
- }
- }
-
- [Fact]
- public void Default_ReturnsSingletonInstance()
- {
- // Act
- UrlEncoder encoder1 = UrlEncoder.Default;
- UrlEncoder encoder2 = UrlEncoder.Default;
-
- // Assert
- Assert.Same(encoder1, encoder2);
- }
-
- [Fact]
- public void UrlEncode_AllRangesAllowed_StillEncodesForbiddenChars()
- {
- // Arrange
- UrlEncoder encoder = new UrlEncoder(UnicodeRanges.All);
-
- // Act & assert - BMP chars
- for (int i = 0; i <= 0xFFFF; i++)
- {
- string input = new String((char)i, 1);
- string expected;
- if (IsSurrogateCodePoint(i))
- {
- expected = "%EF%BF%BD"; // unpaired surrogate -> Unicode replacement char
- }
- else
- {
- bool mustEncode = true;
-
- // RFC 3987, Sec. 2.2 gives the list of allowed chars
- // (We allow 'ipchar' except for "'", "&", "+", "%", and "="
- if (('a' <= i && i <= 'z') || ('A' <= i && i <= 'Z') || ('0' <= i && i <= '9'))
- {
- mustEncode = false; // ALPHA / DIGIT
- }
- else if ((0x00A0 <= i && i <= 0xD7FF) | (0xF900 <= i && i <= 0xFDCF) | (0xFDF0 <= i && i <= 0xFFEF))
- {
- mustEncode = !UnicodeHelpers.IsCharacterDefined((char)i); // 'ucschar'
- }
- else
- {
- switch (i)
- {
- // iunreserved
- case '-':
- case '.':
- case '_':
- case '~':
-
- // isegment-nz-nc
- case '@':
-
- // sub-delims
- case '!':
- case '$':
- case '(':
- case ')':
- case '*':
- case ',':
- case ';':
- mustEncode = false;
- break;
- }
- }
-
- if (mustEncode)
- {
- expected = GetKnownGoodPercentEncodedValue(i);
- }
- else
- {
- expected = input; // no encoding
- }
- }
-
- string retVal = encoder.UrlEncode(input);
- Assert.Equal(expected, retVal);
- }
-
- // Act & assert - astral chars
- for (int i = 0x10000; i <= 0x10FFFF; i++)
- {
- string input = Char.ConvertFromUtf32(i);
- string expected = GetKnownGoodPercentEncodedValue(i);
- string retVal = encoder.UrlEncode(input);
- Assert.Equal(expected, retVal);
- }
- }
-
- [Fact]
- public void UrlEncode_BadSurrogates_ReturnsUnicodeReplacementChar()
- {
- // Arrange
- UrlEncoder encoder = new UrlEncoder(UnicodeRanges.All); // allow all codepoints
-
- // "abcde"
- const string input = "a\uD800b\uDFFFc\uDFFF\uD800d\uDFFF\uD800\uDFFFe\uD800";
- const string expected = "a%EF%BF%BDb%EF%BF%BDc%EF%BF%BD%EF%BF%BDd%EF%BF%BD%F0%90%8F%BFe%EF%BF%BD"; // 'D800' 'DFFF' was preserved since it's valid
-
- // Act
- string retVal = encoder.UrlEncode(input);
-
- // Assert
- Assert.Equal(expected, retVal);
- }
-
- [Fact]
- public void UrlEncode_EmptyStringInput_ReturnsEmptyString()
- {
- // Arrange
- UrlEncoder encoder = new UrlEncoder();
-
- // Act & assert
- Assert.Equal("", encoder.UrlEncode(""));
- }
-
- [Fact]
- public void UrlEncode_InputDoesNotRequireEncoding_ReturnsOriginalStringInstance()
- {
- // Arrange
- UrlEncoder encoder = new UrlEncoder();
- string input = "Hello,there!";
-
- // Act & assert
- Assert.Same(input, encoder.UrlEncode(input));
- }
-
- [Fact]
- public void UrlEncode_NullInput_ReturnsNull()
- {
- // Arrange
- UrlEncoder encoder = new UrlEncoder();
-
- // Act & assert
- Assert.Null(encoder.UrlEncode(null));
- }
-
- [Fact]
- public void UrlEncode_WithCharsRequiringEncodingAtBeginning()
- {
- Assert.Equal(@"%26Hello,there!", new UrlEncoder().UrlEncode("&Hello,there!"));
- }
-
- [Fact]
- public void UrlEncode_WithCharsRequiringEncodingAtEnd()
- {
- Assert.Equal(@"Hello,there!%26", new UrlEncoder().UrlEncode("Hello,there!&"));
- }
-
- [Fact]
- public void UrlEncode_WithCharsRequiringEncodingInMiddle()
- {
- Assert.Equal(@"Hello,%20%26there!", new UrlEncoder().UrlEncode("Hello, &there!"));
- }
-
- [Fact]
- public void UrlEncode_WithCharsRequiringEncodingInterspersed()
- {
- Assert.Equal(@"Hello,%20%3Cthere%3E!", new UrlEncoder().UrlEncode("Hello, !"));
- }
-
- [Fact]
- public void UrlEncode_CharArray()
- {
- // Arrange
- UrlEncoder encoder = new UrlEncoder();
- var output = new StringWriter();
-
- // Act
- encoder.UrlEncode("Hello+world!".ToCharArray(), 3, 5, output);
-
- // Assert
- Assert.Equal("lo%2Bwo", output.ToString());
- }
-
- [Fact]
- public void UrlEncode_StringSubstring()
- {
- // Arrange
- UrlEncoder encoder = new UrlEncoder();
- var output = new StringWriter();
-
- // Act
- encoder.UrlEncode("Hello+world!", 3, 5, output);
-
- // Assert
- Assert.Equal("lo%2Bwo", output.ToString());
- }
-
- [Fact]
- public void UrlEncode_DoesNotOutputHtmlSensitiveCharacters()
- {
- // Per the design document, we provide additional defense-in-depth
- // by never emitting HTML-sensitive characters unescaped.
-
- // Arrange
- UrlEncoder urlEncoder = new UrlEncoder(UnicodeRanges.All);
- HtmlEncoder htmlEncoder = new HtmlEncoder(UnicodeRanges.All);
-
- // Act & assert
- for (int i = 0; i <= 0x10FFFF; i++)
- {
- if (IsSurrogateCodePoint(i))
- {
- continue; // surrogates don't matter here
- }
-
- string urlEncoded = urlEncoder.UrlEncode(Char.ConvertFromUtf32(i));
- string thenHtmlEncoded = htmlEncoder.HtmlEncode(urlEncoded);
- Assert.Equal(urlEncoded, thenHtmlEncoded); // should have contained no HTML-sensitive characters
- }
- }
-
- private static string GetKnownGoodPercentEncodedValue(int codePoint)
- {
- // Convert the code point to UTF16, then call Encoding.UTF8.GetBytes, then hex-encode everything
- return String.Concat(_utf8EncodingThrowOnInvalidBytes.GetBytes(Char.ConvertFromUtf32(codePoint)).Select(b => String.Format(CultureInfo.InvariantCulture, "%{0:X2}", b)));
- }
-
- private static bool IsSurrogateCodePoint(int codePoint)
- {
- return (0xD800 <= codePoint && codePoint <= 0xDFFF);
- }
- }
-}
diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/project.json b/test/Microsoft.Extensions.WebEncoders.Tests/project.json
index 87d9e98e9c..c2b08aa51f 100644
--- a/test/Microsoft.Extensions.WebEncoders.Tests/project.json
+++ b/test/Microsoft.Extensions.WebEncoders.Tests/project.json
@@ -18,6 +18,5 @@
"System.Text.Encoding.Extensions": "4.0.11-beta-*"
}
}
- },
- "resource": "..\\..\\unicode\\UnicodeData.txt"
+ }
}
diff --git a/unicode/Blocks.txt b/unicode/Blocks.txt
deleted file mode 100644
index 0a4a580763..0000000000
--- a/unicode/Blocks.txt
+++ /dev/null
@@ -1,298 +0,0 @@
-# Blocks-8.0.0.txt
-# Date: 2014-11-10, 23:04:00 GMT [KW]
-#
-# Unicode Character Database
-# Copyright (c) 1991-2014 Unicode, Inc.
-# For terms of use, see http://www.unicode.org/terms_of_use.html
-# For documentation, see http://www.unicode.org/reports/tr44/
-#
-# Format:
-# Start Code..End Code; Block Name
-
-# ================================================
-
-# Note: When comparing block names, casing, whitespace, hyphens,
-# and underbars are ignored.
-# For example, "Latin Extended-A" and "latin extended a" are equivalent.
-# For more information on the comparison of property values,
-# see UAX #44: http://www.unicode.org/reports/tr44/
-#
-# All block ranges start with a value where (cp MOD 16) = 0,
-# and end with a value where (cp MOD 16) = 15. In other words,
-# the last hexadecimal digit of the start of range is ...0
-# and the last hexadecimal digit of the end of range is ...F.
-# This constraint on block ranges guarantees that allocations
-# are done in terms of whole columns, and that code chart display
-# never involves splitting columns in the charts.
-#
-# All code points not explicitly listed for Block
-# have the value No_Block.
-
-# Property: Block
-#
-# @missing: 0000..10FFFF; No_Block
-
-0000..007F; Basic Latin
-0080..00FF; Latin-1 Supplement
-0100..017F; Latin Extended-A
-0180..024F; Latin Extended-B
-0250..02AF; IPA Extensions
-02B0..02FF; Spacing Modifier Letters
-0300..036F; Combining Diacritical Marks
-0370..03FF; Greek and Coptic
-0400..04FF; Cyrillic
-0500..052F; Cyrillic Supplement
-0530..058F; Armenian
-0590..05FF; Hebrew
-0600..06FF; Arabic
-0700..074F; Syriac
-0750..077F; Arabic Supplement
-0780..07BF; Thaana
-07C0..07FF; NKo
-0800..083F; Samaritan
-0840..085F; Mandaic
-08A0..08FF; Arabic Extended-A
-0900..097F; Devanagari
-0980..09FF; Bengali
-0A00..0A7F; Gurmukhi
-0A80..0AFF; Gujarati
-0B00..0B7F; Oriya
-0B80..0BFF; Tamil
-0C00..0C7F; Telugu
-0C80..0CFF; Kannada
-0D00..0D7F; Malayalam
-0D80..0DFF; Sinhala
-0E00..0E7F; Thai
-0E80..0EFF; Lao
-0F00..0FFF; Tibetan
-1000..109F; Myanmar
-10A0..10FF; Georgian
-1100..11FF; Hangul Jamo
-1200..137F; Ethiopic
-1380..139F; Ethiopic Supplement
-13A0..13FF; Cherokee
-1400..167F; Unified Canadian Aboriginal Syllabics
-1680..169F; Ogham
-16A0..16FF; Runic
-1700..171F; Tagalog
-1720..173F; Hanunoo
-1740..175F; Buhid
-1760..177F; Tagbanwa
-1780..17FF; Khmer
-1800..18AF; Mongolian
-18B0..18FF; Unified Canadian Aboriginal Syllabics Extended
-1900..194F; Limbu
-1950..197F; Tai Le
-1980..19DF; New Tai Lue
-19E0..19FF; Khmer Symbols
-1A00..1A1F; Buginese
-1A20..1AAF; Tai Tham
-1AB0..1AFF; Combining Diacritical Marks Extended
-1B00..1B7F; Balinese
-1B80..1BBF; Sundanese
-1BC0..1BFF; Batak
-1C00..1C4F; Lepcha
-1C50..1C7F; Ol Chiki
-1CC0..1CCF; Sundanese Supplement
-1CD0..1CFF; Vedic Extensions
-1D00..1D7F; Phonetic Extensions
-1D80..1DBF; Phonetic Extensions Supplement
-1DC0..1DFF; Combining Diacritical Marks Supplement
-1E00..1EFF; Latin Extended Additional
-1F00..1FFF; Greek Extended
-2000..206F; General Punctuation
-2070..209F; Superscripts and Subscripts
-20A0..20CF; Currency Symbols
-20D0..20FF; Combining Diacritical Marks for Symbols
-2100..214F; Letterlike Symbols
-2150..218F; Number Forms
-2190..21FF; Arrows
-2200..22FF; Mathematical Operators
-2300..23FF; Miscellaneous Technical
-2400..243F; Control Pictures
-2440..245F; Optical Character Recognition
-2460..24FF; Enclosed Alphanumerics
-2500..257F; Box Drawing
-2580..259F; Block Elements
-25A0..25FF; Geometric Shapes
-2600..26FF; Miscellaneous Symbols
-2700..27BF; Dingbats
-27C0..27EF; Miscellaneous Mathematical Symbols-A
-27F0..27FF; Supplemental Arrows-A
-2800..28FF; Braille Patterns
-2900..297F; Supplemental Arrows-B
-2980..29FF; Miscellaneous Mathematical Symbols-B
-2A00..2AFF; Supplemental Mathematical Operators
-2B00..2BFF; Miscellaneous Symbols and Arrows
-2C00..2C5F; Glagolitic
-2C60..2C7F; Latin Extended-C
-2C80..2CFF; Coptic
-2D00..2D2F; Georgian Supplement
-2D30..2D7F; Tifinagh
-2D80..2DDF; Ethiopic Extended
-2DE0..2DFF; Cyrillic Extended-A
-2E00..2E7F; Supplemental Punctuation
-2E80..2EFF; CJK Radicals Supplement
-2F00..2FDF; Kangxi Radicals
-2FF0..2FFF; Ideographic Description Characters
-3000..303F; CJK Symbols and Punctuation
-3040..309F; Hiragana
-30A0..30FF; Katakana
-3100..312F; Bopomofo
-3130..318F; Hangul Compatibility Jamo
-3190..319F; Kanbun
-31A0..31BF; Bopomofo Extended
-31C0..31EF; CJK Strokes
-31F0..31FF; Katakana Phonetic Extensions
-3200..32FF; Enclosed CJK Letters and Months
-3300..33FF; CJK Compatibility
-3400..4DBF; CJK Unified Ideographs Extension A
-4DC0..4DFF; Yijing Hexagram Symbols
-4E00..9FFF; CJK Unified Ideographs
-A000..A48F; Yi Syllables
-A490..A4CF; Yi Radicals
-A4D0..A4FF; Lisu
-A500..A63F; Vai
-A640..A69F; Cyrillic Extended-B
-A6A0..A6FF; Bamum
-A700..A71F; Modifier Tone Letters
-A720..A7FF; Latin Extended-D
-A800..A82F; Syloti Nagri
-A830..A83F; Common Indic Number Forms
-A840..A87F; Phags-pa
-A880..A8DF; Saurashtra
-A8E0..A8FF; Devanagari Extended
-A900..A92F; Kayah Li
-A930..A95F; Rejang
-A960..A97F; Hangul Jamo Extended-A
-A980..A9DF; Javanese
-A9E0..A9FF; Myanmar Extended-B
-AA00..AA5F; Cham
-AA60..AA7F; Myanmar Extended-A
-AA80..AADF; Tai Viet
-AAE0..AAFF; Meetei Mayek Extensions
-AB00..AB2F; Ethiopic Extended-A
-AB30..AB6F; Latin Extended-E
-AB70..ABBF; Cherokee Supplement
-ABC0..ABFF; Meetei Mayek
-AC00..D7AF; Hangul Syllables
-D7B0..D7FF; Hangul Jamo Extended-B
-D800..DB7F; High Surrogates
-DB80..DBFF; High Private Use Surrogates
-DC00..DFFF; Low Surrogates
-E000..F8FF; Private Use Area
-F900..FAFF; CJK Compatibility Ideographs
-FB00..FB4F; Alphabetic Presentation Forms
-FB50..FDFF; Arabic Presentation Forms-A
-FE00..FE0F; Variation Selectors
-FE10..FE1F; Vertical Forms
-FE20..FE2F; Combining Half Marks
-FE30..FE4F; CJK Compatibility Forms
-FE50..FE6F; Small Form Variants
-FE70..FEFF; Arabic Presentation Forms-B
-FF00..FFEF; Halfwidth and Fullwidth Forms
-FFF0..FFFF; Specials
-10000..1007F; Linear B Syllabary
-10080..100FF; Linear B Ideograms
-10100..1013F; Aegean Numbers
-10140..1018F; Ancient Greek Numbers
-10190..101CF; Ancient Symbols
-101D0..101FF; Phaistos Disc
-10280..1029F; Lycian
-102A0..102DF; Carian
-102E0..102FF; Coptic Epact Numbers
-10300..1032F; Old Italic
-10330..1034F; Gothic
-10350..1037F; Old Permic
-10380..1039F; Ugaritic
-103A0..103DF; Old Persian
-10400..1044F; Deseret
-10450..1047F; Shavian
-10480..104AF; Osmanya
-10500..1052F; Elbasan
-10530..1056F; Caucasian Albanian
-10600..1077F; Linear A
-10800..1083F; Cypriot Syllabary
-10840..1085F; Imperial Aramaic
-10860..1087F; Palmyrene
-10880..108AF; Nabataean
-108E0..108FF; Hatran
-10900..1091F; Phoenician
-10920..1093F; Lydian
-10980..1099F; Meroitic Hieroglyphs
-109A0..109FF; Meroitic Cursive
-10A00..10A5F; Kharoshthi
-10A60..10A7F; Old South Arabian
-10A80..10A9F; Old North Arabian
-10AC0..10AFF; Manichaean
-10B00..10B3F; Avestan
-10B40..10B5F; Inscriptional Parthian
-10B60..10B7F; Inscriptional Pahlavi
-10B80..10BAF; Psalter Pahlavi
-10C00..10C4F; Old Turkic
-10C80..10CFF; Old Hungarian
-10E60..10E7F; Rumi Numeral Symbols
-11000..1107F; Brahmi
-11080..110CF; Kaithi
-110D0..110FF; Sora Sompeng
-11100..1114F; Chakma
-11150..1117F; Mahajani
-11180..111DF; Sharada
-111E0..111FF; Sinhala Archaic Numbers
-11200..1124F; Khojki
-11280..112AF; Multani
-112B0..112FF; Khudawadi
-11300..1137F; Grantha
-11480..114DF; Tirhuta
-11580..115FF; Siddham
-11600..1165F; Modi
-11680..116CF; Takri
-11700..1173F; Ahom
-118A0..118FF; Warang Citi
-11AC0..11AFF; Pau Cin Hau
-12000..123FF; Cuneiform
-12400..1247F; Cuneiform Numbers and Punctuation
-12480..1254F; Early Dynastic Cuneiform
-13000..1342F; Egyptian Hieroglyphs
-14400..1467F; Anatolian Hieroglyphs
-16800..16A3F; Bamum Supplement
-16A40..16A6F; Mro
-16AD0..16AFF; Bassa Vah
-16B00..16B8F; Pahawh Hmong
-16F00..16F9F; Miao
-1B000..1B0FF; Kana Supplement
-1BC00..1BC9F; Duployan
-1BCA0..1BCAF; Shorthand Format Controls
-1D000..1D0FF; Byzantine Musical Symbols
-1D100..1D1FF; Musical Symbols
-1D200..1D24F; Ancient Greek Musical Notation
-1D300..1D35F; Tai Xuan Jing Symbols
-1D360..1D37F; Counting Rod Numerals
-1D400..1D7FF; Mathematical Alphanumeric Symbols
-1D800..1DAAF; Sutton SignWriting
-1E800..1E8DF; Mende Kikakui
-1EE00..1EEFF; Arabic Mathematical Alphabetic Symbols
-1F000..1F02F; Mahjong Tiles
-1F030..1F09F; Domino Tiles
-1F0A0..1F0FF; Playing Cards
-1F100..1F1FF; Enclosed Alphanumeric Supplement
-1F200..1F2FF; Enclosed Ideographic Supplement
-1F300..1F5FF; Miscellaneous Symbols and Pictographs
-1F600..1F64F; Emoticons
-1F650..1F67F; Ornamental Dingbats
-1F680..1F6FF; Transport and Map Symbols
-1F700..1F77F; Alchemical Symbols
-1F780..1F7FF; Geometric Shapes Extended
-1F800..1F8FF; Supplemental Arrows-C
-1F900..1F9FF; Supplemental Symbols and Pictographs
-20000..2A6DF; CJK Unified Ideographs Extension B
-2A700..2B73F; CJK Unified Ideographs Extension C
-2B740..2B81F; CJK Unified Ideographs Extension D
-2B820..2CEAF; CJK Unified Ideographs Extension E
-2F800..2FA1F; CJK Compatibility Ideographs Supplement
-E0000..E007F; Tags
-E0100..E01EF; Variation Selectors Supplement
-F0000..FFFFF; Supplementary Private Use Area-A
-100000..10FFFF; Supplementary Private Use Area-B
-
-# EOF
diff --git a/unicode/Generators/DefinedCharListGenerator/App.config b/unicode/Generators/DefinedCharListGenerator/App.config
deleted file mode 100644
index 9c05822ff5..0000000000
--- a/unicode/Generators/DefinedCharListGenerator/App.config
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/unicode/Generators/DefinedCharListGenerator/DefinedCharListGenerator.csproj b/unicode/Generators/DefinedCharListGenerator/DefinedCharListGenerator.csproj
deleted file mode 100644
index b1e3df2dc8..0000000000
--- a/unicode/Generators/DefinedCharListGenerator/DefinedCharListGenerator.csproj
+++ /dev/null
@@ -1,61 +0,0 @@
-
-
-
-
- Debug
- AnyCPU
- {0E87CEC9-46CE-4B6B-A613-93AA773C10A4}
- Exe
- Properties
- DefinedCharListGenerator
- DefinedCharListGenerator
- v4.5.1
- 512
- true
-
-
- AnyCPU
- true
- full
- false
- bin\Debug\
- DEBUG;TRACE
- prompt
- 4
-
-
- AnyCPU
- pdbonly
- true
- bin\Release\
- TRACE
- prompt
- 4
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- UnicodeData.txt
- PreserveNewest
-
-
-
-
-
\ No newline at end of file
diff --git a/unicode/Generators/DefinedCharListGenerator/Program.cs b/unicode/Generators/DefinedCharListGenerator/Program.cs
deleted file mode 100644
index edcd0f3602..0000000000
--- a/unicode/Generators/DefinedCharListGenerator/Program.cs
+++ /dev/null
@@ -1,180 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Diagnostics;
-using System.Globalization;
-using System.IO;
-
-namespace DefinedCharListGenerator
-{
- ///
- /// This program outputs the 'unicode-defined-chars.bin' bitmap file.
- ///
- class Program
- {
- static void Main(string[] args)
- {
- // The input file should be UnicodeData.txt from the UCD corresponding to the
- // version of the Unicode spec we're consuming.
- // More info: http://www.unicode.org/reports/tr44/tr44-14.html#UCD_Files
- // Latest UnicodeData.txt: http://www.unicode.org/Public/UCD/latest/ucd/UnicodeData.txt
-
- const uint MAX_UNICODE_CHAR = 0x10FFFF; // Unicode range is U+0000 .. U+10FFFF
- bool[] definedChars = new bool[MAX_UNICODE_CHAR + 1];
- Dictionary spans = new Dictionary();
-
- // Read all defined characters from the input file.
- string[] allLines = File.ReadAllLines("UnicodeData.txt");
-
- // Each line is a semicolon-delimited list of information:
- // ;;;...
- foreach (string line in allLines)
- {
- string[] splitLine = line.Split(new char[] { ';' }, 4);
- uint codepoint = uint.Parse(splitLine[0], NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture);
- string rawName = splitLine[1];
- string category = splitLine[2];
-
- // spans go into their own dictionary for later processing
- string spanName;
- bool isStartOfSpan;
- if (IsSpanDefinition(rawName, out spanName, out isStartOfSpan))
- {
- if (isStartOfSpan)
- {
- spans.Add(spanName, new Span() { FirstCodePoint = codepoint, Category = category });
- }
- else
- {
- var existingSpan = spans[spanName];
- Debug.Assert(existingSpan.FirstCodePoint != 0, "We should've seen the start of this span already.");
- Debug.Assert(existingSpan.LastCodePoint == 0, "We shouldn't have seen the end of this span already.");
- Debug.Assert(existingSpan.Category == category, "Span start Unicode category doesn't match span end Unicode category.");
- existingSpan.LastCodePoint = codepoint;
- }
- continue;
- }
-
- // We only allow certain categories of code points.
- // Zs (space separators) aren't included, but we allow U+0020 SPACE as a special case
-
- if (!(codepoint == (uint)' ' || IsAllowedUnicodeCategory(category)))
- {
- continue;
- }
-
- Debug.Assert(codepoint <= MAX_UNICODE_CHAR);
- definedChars[codepoint] = true;
- }
-
- // Next, populate characters that weren't defined on their own lines
- // but which are instead defined as members of a named span.
- foreach (var span in spans.Values)
- {
- if (IsAllowedUnicodeCategory(span.Category))
- {
- Debug.Assert(span.FirstCodePoint <= MAX_UNICODE_CHAR);
- Debug.Assert(span.LastCodePoint <= MAX_UNICODE_CHAR);
- for (uint i = span.FirstCodePoint; i <= span.LastCodePoint; i++)
- {
- definedChars[i] = true;
- }
- }
- }
-
- // Finally, write the list of defined characters out as a bitmap.
- // Each consecutive block of 8 chars is written as a single byte.
- // For instance, the first byte of the output file contains the
- // bitmap for the following codepoints:
- // - (bit 7) U+0007 [MSB]
- // - (bit 6) U+0006
- // - (bit 5) U+0005
- // - (bit 4) U+0004
- // - (bit 3) U+0003
- // - (bit 2) U+0002
- // - (bit 1) U+0001
- // - (bit 0) U+0000 [LSB]
- // The next byte will contain the bitmap for U+000F to U+0008,
- // and so on until the last byte, which is U+FFFF to U+FFF8.
- // The bytes are written out in little-endian order.
- // We're only concerned about the BMP (U+0000 .. U+FFFF) for now.
- MemoryStream outBuffer = new MemoryStream();
- for (int i = 0; i < 0x10000; i += 8)
- {
- int thisByte = 0;
- for (int j = 7; j >= 0; j--)
- {
- thisByte <<= 1;
- if (definedChars[i + j])
- {
- thisByte |= 0x1;
- }
- }
- outBuffer.WriteByte((byte)thisByte);
- }
-
- File.WriteAllBytes("unicode-defined-chars.bin", outBuffer.ToArray());
- }
-
- private static bool IsAllowedUnicodeCategory(string category)
- {
- // We only allow certain classes of characters
- return category == "Lu" /* letters */
- || category == "Ll"
- || category == "Lt"
- || category == "Lm"
- || category == "Lo"
- || category == "Mn" /* marks */
- || category == "Mc"
- || category == "Me"
- || category == "Nd" /* numbers */
- || category == "Nl"
- || category == "No"
- || category == "Pc" /* punctuation */
- || category == "Pd"
- || category == "Ps"
- || category == "Pe"
- || category == "Pi"
- || category == "Pf"
- || category == "Po"
- || category == "Sm" /* symbols */
- || category == "Sc"
- || category == "Sk"
- || category == "So"
- || category == "Cf"; /* other */
- }
-
- private static bool IsSpanDefinition(string rawName, out string spanName, out bool isStartOfSpan)
- {
- // Spans are represented within angle brackets, such as the following:
- // DC00;;Cs;0;L;;;;;N;;;;;
- // DFFF;;Cs;0;L;;;;;N;;;;;
- if (rawName.StartsWith("<", StringComparison.Ordinal))
- {
- if (rawName.EndsWith(", First>", StringComparison.Ordinal))
- {
- spanName = rawName.Substring(1, rawName.Length - 1 - ", First>".Length);
- isStartOfSpan = true;
- return true;
- }
- else if (rawName.EndsWith(", Last>", StringComparison.Ordinal))
- {
- spanName = rawName.Substring(1, rawName.Length - 1 - ", Last>".Length);
- isStartOfSpan = false;
- return true;
- }
- }
-
- // not surrounded by <>, or or some other non-span
- spanName = null;
- isStartOfSpan = false;
- return false;
- }
-
- private class Span
- {
- public uint FirstCodePoint;
- public uint LastCodePoint;
- public string Category;
- }
- }
-}
diff --git a/unicode/Generators/DefinedCharListGenerator/Properties/AssemblyInfo.cs b/unicode/Generators/DefinedCharListGenerator/Properties/AssemblyInfo.cs
deleted file mode 100644
index 693c041be1..0000000000
--- a/unicode/Generators/DefinedCharListGenerator/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-
-// General Information about an assembly is controlled through the following
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("DefinedCharListGenerator")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("DefinedCharListGenerator")]
-[assembly: AssemblyCopyright("Copyright © 2015")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-
-// Setting ComVisible to false makes the types in this assembly not visible
-// to COM components. If you need to access a type in this assembly from
-// COM, set the ComVisible attribute to true on that type.
-[assembly: ComVisible(false)]
-
-// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("5089f890-38f7-413c-87b0-d8eb1e238ef5")]
-
-// Version information for an assembly consists of the following four values:
-//
-// Major Version
-// Minor Version
-// Build Number
-// Revision
-//
-// You can specify all the values or you can default the Build and Revision Numbers
-// by using the '*' as shown below:
-// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.0.0")]
-[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/unicode/Generators/Generators.sln b/unicode/Generators/Generators.sln
deleted file mode 100644
index acfaad9b24..0000000000
--- a/unicode/Generators/Generators.sln
+++ /dev/null
@@ -1,28 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 2013
-VisualStudioVersion = 12.0.31101.0
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DefinedCharListGenerator", "DefinedCharListGenerator\DefinedCharListGenerator.csproj", "{0E87CEC9-46CE-4B6B-A613-93AA773C10A4}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnicodeTablesGenerator", "UnicodeTablesGenerator\UnicodeTablesGenerator.csproj", "{3D181114-6946-4D34-A3B9-0F83B6B8FEAE}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Any CPU = Debug|Any CPU
- Release|Any CPU = Release|Any CPU
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {0E87CEC9-46CE-4B6B-A613-93AA773C10A4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {0E87CEC9-46CE-4B6B-A613-93AA773C10A4}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {0E87CEC9-46CE-4B6B-A613-93AA773C10A4}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {0E87CEC9-46CE-4B6B-A613-93AA773C10A4}.Release|Any CPU.Build.0 = Release|Any CPU
- {3D181114-6946-4D34-A3B9-0F83B6B8FEAE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {3D181114-6946-4D34-A3B9-0F83B6B8FEAE}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {3D181114-6946-4D34-A3B9-0F83B6B8FEAE}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {3D181114-6946-4D34-A3B9-0F83B6B8FEAE}.Release|Any CPU.Build.0 = Release|Any CPU
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
diff --git a/unicode/Generators/UnicodeTablesGenerator/App.config b/unicode/Generators/UnicodeTablesGenerator/App.config
deleted file mode 100644
index 9c05822ff5..0000000000
--- a/unicode/Generators/UnicodeTablesGenerator/App.config
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/unicode/Generators/UnicodeTablesGenerator/Program.cs b/unicode/Generators/UnicodeTablesGenerator/Program.cs
deleted file mode 100644
index 76e4d7bd15..0000000000
--- a/unicode/Generators/UnicodeTablesGenerator/Program.cs
+++ /dev/null
@@ -1,103 +0,0 @@
-using System;
-using System.Globalization;
-using System.IO;
-using System.Linq;
-using System.Text;
-using System.Text.RegularExpressions;
-
-namespace UnicodeTablesGenerator
-{
- ///
- /// This program outputs the 'UnicodeBlocks.generated.txt' and
- /// 'UnicodeBlocksTests.generated.txt' source files.
- ///
- ///
- /// The generated files require some hand-tweaking. For instance, you'll need
- /// to remove surrogates and private use blocks. The files can then be merged
- /// into the *.generated.cs files as appropriate.
- ///
- class Program
- {
- private const string _codePointFiltersGeneratedFormat = @"
-///
-/// A corresponding to the '{0}' Unicode block (U+{1}..U+{2}).
-///
-///
-/// See http://www.unicode.org/charts/PDF/U{1}.pdf for the full set of characters in this block.
-///
-public static UnicodeRange {3} => Volatile.Read(ref _{4}) ?? CreateRange(ref _{4}, first: '\u{1}', last: '\u{2}');
-private static UnicodeRange _{4};
-";
-
- private const string _codePointFiltersTestsGeneratedFormat = @"[InlineData('\u{1}', '\u{2}', nameof(UnicodeRanges.{0}))]";
-
- private static void Main()
- {
- // The input file should be Blocks.txt from the UCD corresponding to the
- // version of the Unicode spec we're consuming.
- // More info: http://www.unicode.org/reports/tr44/
- // Latest Blocks.txt: http://www.unicode.org/Public/UCD/latest/ucd/Blocks.txt
-
- StringBuilder runtimeCodeBuilder = new StringBuilder();
- StringBuilder testCodeBuilder = new StringBuilder();
- string[] allLines = File.ReadAllLines("Blocks.txt");
-
- Regex regex = new Regex(@"^(?[0-9A-F]{4})\.\.(?[0-9A-F]{4}); (?.+)$");
-
- foreach (var line in allLines)
- {
- // We only care about lines of the form "XXXX..XXXX; Block name"
- var match = regex.Match(line);
- if (match == null || !match.Success)
- {
- continue;
- }
-
- string startCode = match.Groups["startCode"].Value;
- string endCode = match.Groups["endCode"].Value;
- string blockName = match.Groups["blockName"].Value;
- string blockNameAsProperty = RemoveAllNonAlphanumeric(blockName);
- string blockNameAsField = WithDotNetFieldCasing(blockNameAsProperty);
-
- runtimeCodeBuilder.AppendFormat(CultureInfo.InvariantCulture, _codePointFiltersGeneratedFormat,
- blockName, startCode, endCode, blockNameAsProperty, blockNameAsField);
-
- testCodeBuilder.AppendFormat(CultureInfo.InvariantCulture, _codePointFiltersTestsGeneratedFormat,
- blockNameAsProperty, startCode, endCode);
- testCodeBuilder.AppendLine();
- }
-
- File.WriteAllText("UnicodeRanges.generated.txt", runtimeCodeBuilder.ToString());
- File.WriteAllText("UnicodeRangesTests.generated.txt", testCodeBuilder.ToString());
- }
-
- private static string RemoveAllNonAlphanumeric(string blockName)
- {
- // Allow only A-Z 0-9
- return new String(blockName.ToCharArray().Where(c => ('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z') || ('0' <= c && c <= '9')).ToArray());
- }
-
- private static string WithDotNetFieldCasing(string input)
- {
- char[] chars = input.ToCharArray();
- for (int i = 0; i < chars.Length; i++)
- {
- if (Char.IsLower(chars[i]))
- {
- if (i > 1)
- {
- // restore original casing for the previous char unless the previous
- // char was at the front of the string
- chars[i - 1] = input[i - 1];
- }
- break;
- }
- else
- {
- chars[i] = Char.ToLowerInvariant(chars[i]);
- }
- }
- return new String(chars);
- }
- }
-}
diff --git a/unicode/Generators/UnicodeTablesGenerator/Properties/AssemblyInfo.cs b/unicode/Generators/UnicodeTablesGenerator/Properties/AssemblyInfo.cs
deleted file mode 100644
index b7fc3fb222..0000000000
--- a/unicode/Generators/UnicodeTablesGenerator/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-
-// General Information about an assembly is controlled through the following
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("UnicodeTablesGenerator")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("UnicodeTablesGenerator")]
-[assembly: AssemblyCopyright("Copyright © 2015")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-
-// Setting ComVisible to false makes the types in this assembly not visible
-// to COM components. If you need to access a type in this assembly from
-// COM, set the ComVisible attribute to true on that type.
-[assembly: ComVisible(false)]
-
-// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("c9286457-3d25-4143-9458-028aabedc4f5")]
-
-// Version information for an assembly consists of the following four values:
-//
-// Major Version
-// Minor Version
-// Build Number
-// Revision
-//
-// You can specify all the values or you can default the Build and Revision Numbers
-// by using the '*' as shown below:
-// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.0.0")]
-[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/unicode/Generators/UnicodeTablesGenerator/UnicodeTablesGenerator.csproj b/unicode/Generators/UnicodeTablesGenerator/UnicodeTablesGenerator.csproj
deleted file mode 100644
index 2821a1533c..0000000000
--- a/unicode/Generators/UnicodeTablesGenerator/UnicodeTablesGenerator.csproj
+++ /dev/null
@@ -1,61 +0,0 @@
-
-
-
-
- Debug
- AnyCPU
- {3D181114-6946-4D34-A3B9-0F83B6B8FEAE}
- Exe
- Properties
- UnicodeTablesGenerator
- UnicodeTablesGenerator
- v4.5.1
- 512
- true
-
-
- AnyCPU
- true
- full
- false
- bin\Debug\
- DEBUG;TRACE
- prompt
- 4
-
-
- AnyCPU
- pdbonly
- true
- bin\Release\
- TRACE
- prompt
- 4
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Blocks.txt
- PreserveNewest
-
-
-
-
-
\ No newline at end of file
diff --git a/unicode/UnicodeData.txt b/unicode/UnicodeData.txt
deleted file mode 100644
index aa0e914f84..0000000000
--- a/unicode/UnicodeData.txt
+++ /dev/null
@@ -1,29215 +0,0 @@
-0000;;Cc;0;BN;;;;;N;NULL;;;;
-0001;;Cc;0;BN;;;;;N;START OF HEADING;;;;
-0002;;Cc;0;BN;;;;;N;START OF TEXT;;;;
-0003;;Cc;0;BN;;;;;N;END OF TEXT;;;;
-0004;;Cc;0;BN;;;;;N;END OF TRANSMISSION;;;;
-0005;;Cc;0;BN;;;;;N;ENQUIRY;;;;
-0006;;Cc;0;BN;;;;;N;ACKNOWLEDGE;;;;
-0007;;Cc;0;BN;;;;;N;BELL;;;;
-0008;;Cc;0;BN;;;;;N;BACKSPACE;;;;
-0009;;Cc;0;S;;;;;N;CHARACTER TABULATION;;;;
-000A;;Cc;0;B;;;;;N;LINE FEED (LF);;;;
-000B;;Cc;0;S;;;;;N;LINE TABULATION;;;;
-000C;;Cc;0;WS;;;;;N;FORM FEED (FF);;;;
-000D;;Cc;0;B;;;;;N;CARRIAGE RETURN (CR);;;;
-000E;;Cc;0;BN;;;;;N;SHIFT OUT;;;;
-000F;;Cc;0;BN;;;;;N;SHIFT IN;;;;
-0010;;Cc;0;BN;;;;;N;DATA LINK ESCAPE;;;;
-0011;;Cc;0;BN;;;;;N;DEVICE CONTROL ONE;;;;
-0012;;Cc;0;BN;;;;;N;DEVICE CONTROL TWO;;;;
-0013;;Cc;0;BN;;;;;N;DEVICE CONTROL THREE;;;;
-0014;;Cc;0;BN;;;;;N;DEVICE CONTROL FOUR;;;;
-0015;;Cc;0;BN;;;;;N;NEGATIVE ACKNOWLEDGE;;;;
-0016;;Cc;0;BN;;;;;N;SYNCHRONOUS IDLE;;;;
-0017;;Cc;0;BN;;;;;N;END OF TRANSMISSION BLOCK;;;;
-0018;;Cc;0;BN;;;;;N;CANCEL;;;;
-0019;;Cc;0;BN;;;;;N;END OF MEDIUM;;;;
-001A;;Cc;0;BN;;;;;N;SUBSTITUTE;;;;
-001B;;Cc;0;BN;;;;;N;ESCAPE;;;;
-001C;;Cc;0;B;;;;;N;INFORMATION SEPARATOR FOUR;;;;
-001D;;Cc;0;B;;;;;N;INFORMATION SEPARATOR THREE;;;;
-001E;;Cc;0;B;;;;;N;INFORMATION SEPARATOR TWO;;;;
-001F;;Cc;0;S;;;;;N;INFORMATION SEPARATOR ONE;;;;
-0020;SPACE;Zs;0;WS;;;;;N;;;;;
-0021;EXCLAMATION MARK;Po;0;ON;;;;;N;;;;;
-0022;QUOTATION MARK;Po;0;ON;;;;;N;;;;;
-0023;NUMBER SIGN;Po;0;ET;;;;;N;;;;;
-0024;DOLLAR SIGN;Sc;0;ET;;;;;N;;;;;
-0025;PERCENT SIGN;Po;0;ET;;;;;N;;;;;
-0026;AMPERSAND;Po;0;ON;;;;;N;;;;;
-0027;APOSTROPHE;Po;0;ON;;;;;N;APOSTROPHE-QUOTE;;;;
-0028;LEFT PARENTHESIS;Ps;0;ON;;;;;Y;OPENING PARENTHESIS;;;;
-0029;RIGHT PARENTHESIS;Pe;0;ON;;;;;Y;CLOSING PARENTHESIS;;;;
-002A;ASTERISK;Po;0;ON;;;;;N;;;;;
-002B;PLUS SIGN;Sm;0;ES;;;;;N;;;;;
-002C;COMMA;Po;0;CS;;;;;N;;;;;
-002D;HYPHEN-MINUS;Pd;0;ES;;;;;N;;;;;
-002E;FULL STOP;Po;0;CS;;;;;N;PERIOD;;;;
-002F;SOLIDUS;Po;0;CS;;;;;N;SLASH;;;;
-0030;DIGIT ZERO;Nd;0;EN;;0;0;0;N;;;;;
-0031;DIGIT ONE;Nd;0;EN;;1;1;1;N;;;;;
-0032;DIGIT TWO;Nd;0;EN;;2;2;2;N;;;;;
-0033;DIGIT THREE;Nd;0;EN;;3;3;3;N;;;;;
-0034;DIGIT FOUR;Nd;0;EN;;4;4;4;N;;;;;
-0035;DIGIT FIVE;Nd;0;EN;;5;5;5;N;;;;;
-0036;DIGIT SIX;Nd;0;EN;;6;6;6;N;;;;;
-0037;DIGIT SEVEN;Nd;0;EN;;7;7;7;N;;;;;
-0038;DIGIT EIGHT;Nd;0;EN;;8;8;8;N;;;;;
-0039;DIGIT NINE;Nd;0;EN;;9;9;9;N;;;;;
-003A;COLON;Po;0;CS;;;;;N;;;;;
-003B;SEMICOLON;Po;0;ON;;;;;N;;;;;
-003C;LESS-THAN SIGN;Sm;0;ON;;;;;Y;;;;;
-003D;EQUALS SIGN;Sm;0;ON;;;;;N;;;;;
-003E;GREATER-THAN SIGN;Sm;0;ON;;;;;Y;;;;;
-003F;QUESTION MARK;Po;0;ON;;;;;N;;;;;
-0040;COMMERCIAL AT;Po;0;ON;;;;;N;;;;;
-0041;LATIN CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0061;
-0042;LATIN CAPITAL LETTER B;Lu;0;L;;;;;N;;;;0062;
-0043;LATIN CAPITAL LETTER C;Lu;0;L;;;;;N;;;;0063;
-0044;LATIN CAPITAL LETTER D;Lu;0;L;;;;;N;;;;0064;
-0045;LATIN CAPITAL LETTER E;Lu;0;L;;;;;N;;;;0065;
-0046;LATIN CAPITAL LETTER F;Lu;0;L;;;;;N;;;;0066;
-0047;LATIN CAPITAL LETTER G;Lu;0;L;;;;;N;;;;0067;
-0048;LATIN CAPITAL LETTER H;Lu;0;L;;;;;N;;;;0068;
-0049;LATIN CAPITAL LETTER I;Lu;0;L;;;;;N;;;;0069;
-004A;LATIN CAPITAL LETTER J;Lu;0;L;;;;;N;;;;006A;
-004B;LATIN CAPITAL LETTER K;Lu;0;L;;;;;N;;;;006B;
-004C;LATIN CAPITAL LETTER L;Lu;0;L;;;;;N;;;;006C;
-004D;LATIN CAPITAL LETTER M;Lu;0;L;;;;;N;;;;006D;
-004E;LATIN CAPITAL LETTER N;Lu;0;L;;;;;N;;;;006E;
-004F;LATIN CAPITAL LETTER O;Lu;0;L;;;;;N;;;;006F;
-0050;LATIN CAPITAL LETTER P;Lu;0;L;;;;;N;;;;0070;
-0051;LATIN CAPITAL LETTER Q;Lu;0;L;;;;;N;;;;0071;
-0052;LATIN CAPITAL LETTER R;Lu;0;L;;;;;N;;;;0072;
-0053;LATIN CAPITAL LETTER S;Lu;0;L;;;;;N;;;;0073;
-0054;LATIN CAPITAL LETTER T;Lu;0;L;;;;;N;;;;0074;
-0055;LATIN CAPITAL LETTER U;Lu;0;L;;;;;N;;;;0075;
-0056;LATIN CAPITAL LETTER V;Lu;0;L;;;;;N;;;;0076;
-0057;LATIN CAPITAL LETTER W;Lu;0;L;;;;;N;;;;0077;
-0058;LATIN CAPITAL LETTER X;Lu;0;L;;;;;N;;;;0078;
-0059;LATIN CAPITAL LETTER Y;Lu;0;L;;;;;N;;;;0079;
-005A;LATIN CAPITAL LETTER Z;Lu;0;L;;;;;N;;;;007A;
-005B;LEFT SQUARE BRACKET;Ps;0;ON;;;;;Y;OPENING SQUARE BRACKET;;;;
-005C;REVERSE SOLIDUS;Po;0;ON;;;;;N;BACKSLASH;;;;
-005D;RIGHT SQUARE BRACKET;Pe;0;ON;;;;;Y;CLOSING SQUARE BRACKET;;;;
-005E;CIRCUMFLEX ACCENT;Sk;0;ON;;;;;N;SPACING CIRCUMFLEX;;;;
-005F;LOW LINE;Pc;0;ON;;;;;N;SPACING UNDERSCORE;;;;
-0060;GRAVE ACCENT;Sk;0;ON;;;;;N;SPACING GRAVE;;;;
-0061;LATIN SMALL LETTER A;Ll;0;L;;;;;N;;;0041;;0041
-0062;LATIN SMALL LETTER B;Ll;0;L;;;;;N;;;0042;;0042
-0063;LATIN SMALL LETTER C;Ll;0;L;;;;;N;;;0043;;0043
-0064;LATIN SMALL LETTER D;Ll;0;L;;;;;N;;;0044;;0044
-0065;LATIN SMALL LETTER E;Ll;0;L;;;;;N;;;0045;;0045
-0066;LATIN SMALL LETTER F;Ll;0;L;;;;;N;;;0046;;0046
-0067;LATIN SMALL LETTER G;Ll;0;L;;;;;N;;;0047;;0047
-0068;LATIN SMALL LETTER H;Ll;0;L;;;;;N;;;0048;;0048
-0069;LATIN SMALL LETTER I;Ll;0;L;;;;;N;;;0049;;0049
-006A;LATIN SMALL LETTER J;Ll;0;L;;;;;N;;;004A;;004A
-006B;LATIN SMALL LETTER K;Ll;0;L;;;;;N;;;004B;;004B
-006C;LATIN SMALL LETTER L;Ll;0;L;;;;;N;;;004C;;004C
-006D;LATIN SMALL LETTER M;Ll;0;L;;;;;N;;;004D;;004D
-006E;LATIN SMALL LETTER N;Ll;0;L;;;;;N;;;004E;;004E
-006F;LATIN SMALL LETTER O;Ll;0;L;;;;;N;;;004F;;004F
-0070;LATIN SMALL LETTER P;Ll;0;L;;;;;N;;;0050;;0050
-0071;LATIN SMALL LETTER Q;Ll;0;L;;;;;N;;;0051;;0051
-0072;LATIN SMALL LETTER R;Ll;0;L;;;;;N;;;0052;;0052
-0073;LATIN SMALL LETTER S;Ll;0;L;;;;;N;;;0053;;0053
-0074;LATIN SMALL LETTER T;Ll;0;L;;;;;N;;;0054;;0054
-0075;LATIN SMALL LETTER U;Ll;0;L;;;;;N;;;0055;;0055
-0076;LATIN SMALL LETTER V;Ll;0;L;;;;;N;;;0056;;0056
-0077;LATIN SMALL LETTER W;Ll;0;L;;;;;N;;;0057;;0057
-0078;LATIN SMALL LETTER X;Ll;0;L;;;;;N;;;0058;;0058
-0079;LATIN SMALL LETTER Y;Ll;0;L;;;;;N;;;0059;;0059
-007A;LATIN SMALL LETTER Z;Ll;0;L;;;;;N;;;005A;;005A
-007B;LEFT CURLY BRACKET;Ps;0;ON;;;;;Y;OPENING CURLY BRACKET;;;;
-007C;VERTICAL LINE;Sm;0;ON;;;;;N;VERTICAL BAR;;;;
-007D;RIGHT CURLY BRACKET;Pe;0;ON;;;;;Y;CLOSING CURLY BRACKET;;;;
-007E;TILDE;Sm;0;ON;;;;;N;;;;;
-007F;;Cc;0;BN;;;;;N;DELETE;;;;
-0080;;Cc;0;BN;;;;;N;;;;;
-0081;;Cc;0;BN;;;;;N;;;;;
-0082;;Cc;0;BN;;;;;N;BREAK PERMITTED HERE;;;;
-0083;;Cc;0;BN;;;;;N;NO BREAK HERE;;;;
-0084;;Cc;0;BN;;;;;N;;;;;
-0085;;Cc;0;B;;;;;N;NEXT LINE (NEL);;;;
-0086;;Cc;0;BN;;;;;N;START OF SELECTED AREA;;;;
-0087;;Cc;0;BN;;;;;N;END OF SELECTED AREA;;;;
-0088;;Cc;0;BN;;;;;N;CHARACTER TABULATION SET;;;;
-0089;;Cc;0;BN;;;;;N;CHARACTER TABULATION WITH JUSTIFICATION;;;;
-008A;;Cc;0;BN;;;;;N;LINE TABULATION SET;;;;
-008B;;Cc;0;BN;;;;;N;PARTIAL LINE FORWARD;;;;
-008C;;Cc;0;BN;;;;;N;PARTIAL LINE BACKWARD;;;;
-008D;;Cc;0;BN;;;;;N;REVERSE LINE FEED;;;;
-008E;;Cc;0;BN;;;;;N;SINGLE SHIFT TWO;;;;
-008F;;Cc;0;BN;;;;;N;SINGLE SHIFT THREE;;;;
-0090;;Cc;0;BN;;;;;N;DEVICE CONTROL STRING;;;;
-0091;;Cc;0;BN;;;;;N;PRIVATE USE ONE;;;;
-0092;;Cc;0;BN;;;;;N;PRIVATE USE TWO;;;;
-0093;;Cc;0;BN;;;;;N;SET TRANSMIT STATE;;;;
-0094;;Cc;0;BN;;;;;N;CANCEL CHARACTER;;;;
-0095;;Cc;0;BN;;;;;N;MESSAGE WAITING;;;;
-0096;;Cc;0;BN;;;;;N;START OF GUARDED AREA;;;;
-0097;;Cc;0;BN;;;;;N;END OF GUARDED AREA;;;;
-0098;;Cc;0;BN;;;;;N;START OF STRING;;;;
-0099;;Cc;0;BN;;;;;N;;;;;
-009A;;Cc;0;BN;;;;;N;SINGLE CHARACTER INTRODUCER;;;;
-009B;;Cc;0;BN;;;;;N;CONTROL SEQUENCE INTRODUCER;;;;
-009C;;Cc;0;BN;;;;;N;STRING TERMINATOR;;;;
-009D;;Cc;0;BN;;;;;N;OPERATING SYSTEM COMMAND;;;;
-009E;;Cc;0;BN;;;;;N;PRIVACY MESSAGE;;;;
-009F;;Cc;0;BN;;;;;N;APPLICATION PROGRAM COMMAND;;;;
-00A0;NO-BREAK SPACE;Zs;0;CS; 0020;;;;N;NON-BREAKING SPACE;;;;
-00A1;INVERTED EXCLAMATION MARK;Po;0;ON;;;;;N;;;;;
-00A2;CENT SIGN;Sc;0;ET;;;;;N;;;;;
-00A3;POUND SIGN;Sc;0;ET;;;;;N;;;;;
-00A4;CURRENCY SIGN;Sc;0;ET;;;;;N;;;;;
-00A5;YEN SIGN;Sc;0;ET;;;;;N;;;;;
-00A6;BROKEN BAR;So;0;ON;;;;;N;BROKEN VERTICAL BAR;;;;
-00A7;SECTION SIGN;Po;0;ON;;;;;N;;;;;
-00A8;DIAERESIS;Sk;0;ON; 0020 0308;;;;N;SPACING DIAERESIS;;;;
-00A9;COPYRIGHT SIGN;So;0;ON;;;;;N;;;;;
-00AA;FEMININE ORDINAL INDICATOR;Lo;0;L; 0061;;;;N;;;;;
-00AB;LEFT-POINTING DOUBLE ANGLE QUOTATION MARK;Pi;0;ON;;;;;Y;LEFT POINTING GUILLEMET;;;;
-00AC;NOT SIGN;Sm;0;ON;;;;;N;;;;;
-00AD;SOFT HYPHEN;Cf;0;BN;;;;;N;;;;;
-00AE;REGISTERED SIGN;So;0;ON;;;;;N;REGISTERED TRADE MARK SIGN;;;;
-00AF;MACRON;Sk;0;ON; 0020 0304;;;;N;SPACING MACRON;;;;
-00B0;DEGREE SIGN;So;0;ET;;;;;N;;;;;
-00B1;PLUS-MINUS SIGN;Sm;0;ET;;;;;N;PLUS-OR-MINUS SIGN;;;;
-00B2;SUPERSCRIPT TWO;No;0;EN; 0032;;2;2;N;SUPERSCRIPT DIGIT TWO;;;;
-00B3;SUPERSCRIPT THREE;No;0;EN; 0033;;3;3;N;SUPERSCRIPT DIGIT THREE;;;;
-00B4;ACUTE ACCENT;Sk;0;ON; 0020 0301;;;;N;SPACING ACUTE;;;;
-00B5;MICRO SIGN;Ll;0;L; 03BC;;;;N;;;039C;;039C
-00B6;PILCROW SIGN;Po;0;ON;;;;;N;PARAGRAPH SIGN;;;;
-00B7;MIDDLE DOT;Po;0;ON;;;;;N;;;;;
-00B8;CEDILLA;Sk;0;ON; 0020 0327;;;;N;SPACING CEDILLA;;;;
-00B9;SUPERSCRIPT ONE;No;0;EN; 0031;;1;1;N;SUPERSCRIPT DIGIT ONE;;;;
-00BA;MASCULINE ORDINAL INDICATOR;Lo;0;L; 006F;;;;N;;;;;
-00BB;RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK;Pf;0;ON;;;;;Y;RIGHT POINTING GUILLEMET;;;;
-00BC;VULGAR FRACTION ONE QUARTER;No;0;ON; 0031 2044 0034;;;1/4;N;FRACTION ONE QUARTER;;;;
-00BD;VULGAR FRACTION ONE HALF;No;0;ON; 0031 2044 0032;;;1/2;N;FRACTION ONE HALF;;;;
-00BE;VULGAR FRACTION THREE QUARTERS;No;0;ON; 0033 2044 0034;;;3/4;N;FRACTION THREE QUARTERS;;;;
-00BF;INVERTED QUESTION MARK;Po;0;ON;;;;;N;;;;;
-00C0;LATIN CAPITAL LETTER A WITH GRAVE;Lu;0;L;0041 0300;;;;N;LATIN CAPITAL LETTER A GRAVE;;;00E0;
-00C1;LATIN CAPITAL LETTER A WITH ACUTE;Lu;0;L;0041 0301;;;;N;LATIN CAPITAL LETTER A ACUTE;;;00E1;
-00C2;LATIN CAPITAL LETTER A WITH CIRCUMFLEX;Lu;0;L;0041 0302;;;;N;LATIN CAPITAL LETTER A CIRCUMFLEX;;;00E2;
-00C3;LATIN CAPITAL LETTER A WITH TILDE;Lu;0;L;0041 0303;;;;N;LATIN CAPITAL LETTER A TILDE;;;00E3;
-00C4;LATIN CAPITAL LETTER A WITH DIAERESIS;Lu;0;L;0041 0308;;;;N;LATIN CAPITAL LETTER A DIAERESIS;;;00E4;
-00C5;LATIN CAPITAL LETTER A WITH RING ABOVE;Lu;0;L;0041 030A;;;;N;LATIN CAPITAL LETTER A RING;;;00E5;
-00C6;LATIN CAPITAL LETTER AE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER A E;;;00E6;
-00C7;LATIN CAPITAL LETTER C WITH CEDILLA;Lu;0;L;0043 0327;;;;N;LATIN CAPITAL LETTER C CEDILLA;;;00E7;
-00C8;LATIN CAPITAL LETTER E WITH GRAVE;Lu;0;L;0045 0300;;;;N;LATIN CAPITAL LETTER E GRAVE;;;00E8;
-00C9;LATIN CAPITAL LETTER E WITH ACUTE;Lu;0;L;0045 0301;;;;N;LATIN CAPITAL LETTER E ACUTE;;;00E9;
-00CA;LATIN CAPITAL LETTER E WITH CIRCUMFLEX;Lu;0;L;0045 0302;;;;N;LATIN CAPITAL LETTER E CIRCUMFLEX;;;00EA;
-00CB;LATIN CAPITAL LETTER E WITH DIAERESIS;Lu;0;L;0045 0308;;;;N;LATIN CAPITAL LETTER E DIAERESIS;;;00EB;
-00CC;LATIN CAPITAL LETTER I WITH GRAVE;Lu;0;L;0049 0300;;;;N;LATIN CAPITAL LETTER I GRAVE;;;00EC;
-00CD;LATIN CAPITAL LETTER I WITH ACUTE;Lu;0;L;0049 0301;;;;N;LATIN CAPITAL LETTER I ACUTE;;;00ED;
-00CE;LATIN CAPITAL LETTER I WITH CIRCUMFLEX;Lu;0;L;0049 0302;;;;N;LATIN CAPITAL LETTER I CIRCUMFLEX;;;00EE;
-00CF;LATIN CAPITAL LETTER I WITH DIAERESIS;Lu;0;L;0049 0308;;;;N;LATIN CAPITAL LETTER I DIAERESIS;;;00EF;
-00D0;LATIN CAPITAL LETTER ETH;Lu;0;L;;;;;N;;;;00F0;
-00D1;LATIN CAPITAL LETTER N WITH TILDE;Lu;0;L;004E 0303;;;;N;LATIN CAPITAL LETTER N TILDE;;;00F1;
-00D2;LATIN CAPITAL LETTER O WITH GRAVE;Lu;0;L;004F 0300;;;;N;LATIN CAPITAL LETTER O GRAVE;;;00F2;
-00D3;LATIN CAPITAL LETTER O WITH ACUTE;Lu;0;L;004F 0301;;;;N;LATIN CAPITAL LETTER O ACUTE;;;00F3;
-00D4;LATIN CAPITAL LETTER O WITH CIRCUMFLEX;Lu;0;L;004F 0302;;;;N;LATIN CAPITAL LETTER O CIRCUMFLEX;;;00F4;
-00D5;LATIN CAPITAL LETTER O WITH TILDE;Lu;0;L;004F 0303;;;;N;LATIN CAPITAL LETTER O TILDE;;;00F5;
-00D6;LATIN CAPITAL LETTER O WITH DIAERESIS;Lu;0;L;004F 0308;;;;N;LATIN CAPITAL LETTER O DIAERESIS;;;00F6;
-00D7;MULTIPLICATION SIGN;Sm;0;ON;;;;;N;;;;;
-00D8;LATIN CAPITAL LETTER O WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O SLASH;;;00F8;
-00D9;LATIN CAPITAL LETTER U WITH GRAVE;Lu;0;L;0055 0300;;;;N;LATIN CAPITAL LETTER U GRAVE;;;00F9;
-00DA;LATIN CAPITAL LETTER U WITH ACUTE;Lu;0;L;0055 0301;;;;N;LATIN CAPITAL LETTER U ACUTE;;;00FA;
-00DB;LATIN CAPITAL LETTER U WITH CIRCUMFLEX;Lu;0;L;0055 0302;;;;N;LATIN CAPITAL LETTER U CIRCUMFLEX;;;00FB;
-00DC;LATIN CAPITAL LETTER U WITH DIAERESIS;Lu;0;L;0055 0308;;;;N;LATIN CAPITAL LETTER U DIAERESIS;;;00FC;
-00DD;LATIN CAPITAL LETTER Y WITH ACUTE;Lu;0;L;0059 0301;;;;N;LATIN CAPITAL LETTER Y ACUTE;;;00FD;
-00DE;LATIN CAPITAL LETTER THORN;Lu;0;L;;;;;N;;;;00FE;
-00DF;LATIN SMALL LETTER SHARP S;Ll;0;L;;;;;N;;;;;
-00E0;LATIN SMALL LETTER A WITH GRAVE;Ll;0;L;0061 0300;;;;N;LATIN SMALL LETTER A GRAVE;;00C0;;00C0
-00E1;LATIN SMALL LETTER A WITH ACUTE;Ll;0;L;0061 0301;;;;N;LATIN SMALL LETTER A ACUTE;;00C1;;00C1
-00E2;LATIN SMALL LETTER A WITH CIRCUMFLEX;Ll;0;L;0061 0302;;;;N;LATIN SMALL LETTER A CIRCUMFLEX;;00C2;;00C2
-00E3;LATIN SMALL LETTER A WITH TILDE;Ll;0;L;0061 0303;;;;N;LATIN SMALL LETTER A TILDE;;00C3;;00C3
-00E4;LATIN SMALL LETTER A WITH DIAERESIS;Ll;0;L;0061 0308;;;;N;LATIN SMALL LETTER A DIAERESIS;;00C4;;00C4
-00E5;LATIN SMALL LETTER A WITH RING ABOVE;Ll;0;L;0061 030A;;;;N;LATIN SMALL LETTER A RING;;00C5;;00C5
-00E6;LATIN SMALL LETTER AE;Ll;0;L;;;;;N;LATIN SMALL LETTER A E;;00C6;;00C6
-00E7;LATIN SMALL LETTER C WITH CEDILLA;Ll;0;L;0063 0327;;;;N;LATIN SMALL LETTER C CEDILLA;;00C7;;00C7
-00E8;LATIN SMALL LETTER E WITH GRAVE;Ll;0;L;0065 0300;;;;N;LATIN SMALL LETTER E GRAVE;;00C8;;00C8
-00E9;LATIN SMALL LETTER E WITH ACUTE;Ll;0;L;0065 0301;;;;N;LATIN SMALL LETTER E ACUTE;;00C9;;00C9
-00EA;LATIN SMALL LETTER E WITH CIRCUMFLEX;Ll;0;L;0065 0302;;;;N;LATIN SMALL LETTER E CIRCUMFLEX;;00CA;;00CA
-00EB;LATIN SMALL LETTER E WITH DIAERESIS;Ll;0;L;0065 0308;;;;N;LATIN SMALL LETTER E DIAERESIS;;00CB;;00CB
-00EC;LATIN SMALL LETTER I WITH GRAVE;Ll;0;L;0069 0300;;;;N;LATIN SMALL LETTER I GRAVE;;00CC;;00CC
-00ED;LATIN SMALL LETTER I WITH ACUTE;Ll;0;L;0069 0301;;;;N;LATIN SMALL LETTER I ACUTE;;00CD;;00CD
-00EE;LATIN SMALL LETTER I WITH CIRCUMFLEX;Ll;0;L;0069 0302;;;;N;LATIN SMALL LETTER I CIRCUMFLEX;;00CE;;00CE
-00EF;LATIN SMALL LETTER I WITH DIAERESIS;Ll;0;L;0069 0308;;;;N;LATIN SMALL LETTER I DIAERESIS;;00CF;;00CF
-00F0;LATIN SMALL LETTER ETH;Ll;0;L;;;;;N;;;00D0;;00D0
-00F1;LATIN SMALL LETTER N WITH TILDE;Ll;0;L;006E 0303;;;;N;LATIN SMALL LETTER N TILDE;;00D1;;00D1
-00F2;LATIN SMALL LETTER O WITH GRAVE;Ll;0;L;006F 0300;;;;N;LATIN SMALL LETTER O GRAVE;;00D2;;00D2
-00F3;LATIN SMALL LETTER O WITH ACUTE;Ll;0;L;006F 0301;;;;N;LATIN SMALL LETTER O ACUTE;;00D3;;00D3
-00F4;LATIN SMALL LETTER O WITH CIRCUMFLEX;Ll;0;L;006F 0302;;;;N;LATIN SMALL LETTER O CIRCUMFLEX;;00D4;;00D4
-00F5;LATIN SMALL LETTER O WITH TILDE;Ll;0;L;006F 0303;;;;N;LATIN SMALL LETTER O TILDE;;00D5;;00D5
-00F6;LATIN SMALL LETTER O WITH DIAERESIS;Ll;0;L;006F 0308;;;;N;LATIN SMALL LETTER O DIAERESIS;;00D6;;00D6
-00F7;DIVISION SIGN;Sm;0;ON;;;;;N;;;;;
-00F8;LATIN SMALL LETTER O WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER O SLASH;;00D8;;00D8
-00F9;LATIN SMALL LETTER U WITH GRAVE;Ll;0;L;0075 0300;;;;N;LATIN SMALL LETTER U GRAVE;;00D9;;00D9
-00FA;LATIN SMALL LETTER U WITH ACUTE;Ll;0;L;0075 0301;;;;N;LATIN SMALL LETTER U ACUTE;;00DA;;00DA
-00FB;LATIN SMALL LETTER U WITH CIRCUMFLEX;Ll;0;L;0075 0302;;;;N;LATIN SMALL LETTER U CIRCUMFLEX;;00DB;;00DB
-00FC;LATIN SMALL LETTER U WITH DIAERESIS;Ll;0;L;0075 0308;;;;N;LATIN SMALL LETTER U DIAERESIS;;00DC;;00DC
-00FD;LATIN SMALL LETTER Y WITH ACUTE;Ll;0;L;0079 0301;;;;N;LATIN SMALL LETTER Y ACUTE;;00DD;;00DD
-00FE;LATIN SMALL LETTER THORN;Ll;0;L;;;;;N;;;00DE;;00DE
-00FF;LATIN SMALL LETTER Y WITH DIAERESIS;Ll;0;L;0079 0308;;;;N;LATIN SMALL LETTER Y DIAERESIS;;0178;;0178
-0100;LATIN CAPITAL LETTER A WITH MACRON;Lu;0;L;0041 0304;;;;N;LATIN CAPITAL LETTER A MACRON;;;0101;
-0101;LATIN SMALL LETTER A WITH MACRON;Ll;0;L;0061 0304;;;;N;LATIN SMALL LETTER A MACRON;;0100;;0100
-0102;LATIN CAPITAL LETTER A WITH BREVE;Lu;0;L;0041 0306;;;;N;LATIN CAPITAL LETTER A BREVE;;;0103;
-0103;LATIN SMALL LETTER A WITH BREVE;Ll;0;L;0061 0306;;;;N;LATIN SMALL LETTER A BREVE;;0102;;0102
-0104;LATIN CAPITAL LETTER A WITH OGONEK;Lu;0;L;0041 0328;;;;N;LATIN CAPITAL LETTER A OGONEK;;;0105;
-0105;LATIN SMALL LETTER A WITH OGONEK;Ll;0;L;0061 0328;;;;N;LATIN SMALL LETTER A OGONEK;;0104;;0104
-0106;LATIN CAPITAL LETTER C WITH ACUTE;Lu;0;L;0043 0301;;;;N;LATIN CAPITAL LETTER C ACUTE;;;0107;
-0107;LATIN SMALL LETTER C WITH ACUTE;Ll;0;L;0063 0301;;;;N;LATIN SMALL LETTER C ACUTE;;0106;;0106
-0108;LATIN CAPITAL LETTER C WITH CIRCUMFLEX;Lu;0;L;0043 0302;;;;N;LATIN CAPITAL LETTER C CIRCUMFLEX;;;0109;
-0109;LATIN SMALL LETTER C WITH CIRCUMFLEX;Ll;0;L;0063 0302;;;;N;LATIN SMALL LETTER C CIRCUMFLEX;;0108;;0108
-010A;LATIN CAPITAL LETTER C WITH DOT ABOVE;Lu;0;L;0043 0307;;;;N;LATIN CAPITAL LETTER C DOT;;;010B;
-010B;LATIN SMALL LETTER C WITH DOT ABOVE;Ll;0;L;0063 0307;;;;N;LATIN SMALL LETTER C DOT;;010A;;010A
-010C;LATIN CAPITAL LETTER C WITH CARON;Lu;0;L;0043 030C;;;;N;LATIN CAPITAL LETTER C HACEK;;;010D;
-010D;LATIN SMALL LETTER C WITH CARON;Ll;0;L;0063 030C;;;;N;LATIN SMALL LETTER C HACEK;;010C;;010C
-010E;LATIN CAPITAL LETTER D WITH CARON;Lu;0;L;0044 030C;;;;N;LATIN CAPITAL LETTER D HACEK;;;010F;
-010F;LATIN SMALL LETTER D WITH CARON;Ll;0;L;0064 030C;;;;N;LATIN SMALL LETTER D HACEK;;010E;;010E
-0110;LATIN CAPITAL LETTER D WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D BAR;;;0111;
-0111;LATIN SMALL LETTER D WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER D BAR;;0110;;0110
-0112;LATIN CAPITAL LETTER E WITH MACRON;Lu;0;L;0045 0304;;;;N;LATIN CAPITAL LETTER E MACRON;;;0113;
-0113;LATIN SMALL LETTER E WITH MACRON;Ll;0;L;0065 0304;;;;N;LATIN SMALL LETTER E MACRON;;0112;;0112
-0114;LATIN CAPITAL LETTER E WITH BREVE;Lu;0;L;0045 0306;;;;N;LATIN CAPITAL LETTER E BREVE;;;0115;
-0115;LATIN SMALL LETTER E WITH BREVE;Ll;0;L;0065 0306;;;;N;LATIN SMALL LETTER E BREVE;;0114;;0114
-0116;LATIN CAPITAL LETTER E WITH DOT ABOVE;Lu;0;L;0045 0307;;;;N;LATIN CAPITAL LETTER E DOT;;;0117;
-0117;LATIN SMALL LETTER E WITH DOT ABOVE;Ll;0;L;0065 0307;;;;N;LATIN SMALL LETTER E DOT;;0116;;0116
-0118;LATIN CAPITAL LETTER E WITH OGONEK;Lu;0;L;0045 0328;;;;N;LATIN CAPITAL LETTER E OGONEK;;;0119;
-0119;LATIN SMALL LETTER E WITH OGONEK;Ll;0;L;0065 0328;;;;N;LATIN SMALL LETTER E OGONEK;;0118;;0118
-011A;LATIN CAPITAL LETTER E WITH CARON;Lu;0;L;0045 030C;;;;N;LATIN CAPITAL LETTER E HACEK;;;011B;
-011B;LATIN SMALL LETTER E WITH CARON;Ll;0;L;0065 030C;;;;N;LATIN SMALL LETTER E HACEK;;011A;;011A
-011C;LATIN CAPITAL LETTER G WITH CIRCUMFLEX;Lu;0;L;0047 0302;;;;N;LATIN CAPITAL LETTER G CIRCUMFLEX;;;011D;
-011D;LATIN SMALL LETTER G WITH CIRCUMFLEX;Ll;0;L;0067 0302;;;;N;LATIN SMALL LETTER G CIRCUMFLEX;;011C;;011C
-011E;LATIN CAPITAL LETTER G WITH BREVE;Lu;0;L;0047 0306;;;;N;LATIN CAPITAL LETTER G BREVE;;;011F;
-011F;LATIN SMALL LETTER G WITH BREVE;Ll;0;L;0067 0306;;;;N;LATIN SMALL LETTER G BREVE;;011E;;011E
-0120;LATIN CAPITAL LETTER G WITH DOT ABOVE;Lu;0;L;0047 0307;;;;N;LATIN CAPITAL LETTER G DOT;;;0121;
-0121;LATIN SMALL LETTER G WITH DOT ABOVE;Ll;0;L;0067 0307;;;;N;LATIN SMALL LETTER G DOT;;0120;;0120
-0122;LATIN CAPITAL LETTER G WITH CEDILLA;Lu;0;L;0047 0327;;;;N;LATIN CAPITAL LETTER G CEDILLA;;;0123;
-0123;LATIN SMALL LETTER G WITH CEDILLA;Ll;0;L;0067 0327;;;;N;LATIN SMALL LETTER G CEDILLA;;0122;;0122
-0124;LATIN CAPITAL LETTER H WITH CIRCUMFLEX;Lu;0;L;0048 0302;;;;N;LATIN CAPITAL LETTER H CIRCUMFLEX;;;0125;
-0125;LATIN SMALL LETTER H WITH CIRCUMFLEX;Ll;0;L;0068 0302;;;;N;LATIN SMALL LETTER H CIRCUMFLEX;;0124;;0124
-0126;LATIN CAPITAL LETTER H WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER H BAR;;;0127;
-0127;LATIN SMALL LETTER H WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER H BAR;;0126;;0126
-0128;LATIN CAPITAL LETTER I WITH TILDE;Lu;0;L;0049 0303;;;;N;LATIN CAPITAL LETTER I TILDE;;;0129;
-0129;LATIN SMALL LETTER I WITH TILDE;Ll;0;L;0069 0303;;;;N;LATIN SMALL LETTER I TILDE;;0128;;0128
-012A;LATIN CAPITAL LETTER I WITH MACRON;Lu;0;L;0049 0304;;;;N;LATIN CAPITAL LETTER I MACRON;;;012B;
-012B;LATIN SMALL LETTER I WITH MACRON;Ll;0;L;0069 0304;;;;N;LATIN SMALL LETTER I MACRON;;012A;;012A
-012C;LATIN CAPITAL LETTER I WITH BREVE;Lu;0;L;0049 0306;;;;N;LATIN CAPITAL LETTER I BREVE;;;012D;
-012D;LATIN SMALL LETTER I WITH BREVE;Ll;0;L;0069 0306;;;;N;LATIN SMALL LETTER I BREVE;;012C;;012C
-012E;LATIN CAPITAL LETTER I WITH OGONEK;Lu;0;L;0049 0328;;;;N;LATIN CAPITAL LETTER I OGONEK;;;012F;
-012F;LATIN SMALL LETTER I WITH OGONEK;Ll;0;L;0069 0328;;;;N;LATIN SMALL LETTER I OGONEK;;012E;;012E
-0130;LATIN CAPITAL LETTER I WITH DOT ABOVE;Lu;0;L;0049 0307;;;;N;LATIN CAPITAL LETTER I DOT;;;0069;
-0131;LATIN SMALL LETTER DOTLESS I;Ll;0;L;;;;;N;;;0049;;0049
-0132;LATIN CAPITAL LIGATURE IJ;Lu;0;L; 0049 004A;;;;N;LATIN CAPITAL LETTER I J;;;0133;
-0133;LATIN SMALL LIGATURE IJ;Ll;0;L; 0069 006A;;;;N;LATIN SMALL LETTER I J;;0132;;0132
-0134;LATIN CAPITAL LETTER J WITH CIRCUMFLEX;Lu;0;L;004A 0302;;;;N;LATIN CAPITAL LETTER J CIRCUMFLEX;;;0135;
-0135;LATIN SMALL LETTER J WITH CIRCUMFLEX;Ll;0;L;006A 0302;;;;N;LATIN SMALL LETTER J CIRCUMFLEX;;0134;;0134
-0136;LATIN CAPITAL LETTER K WITH CEDILLA;Lu;0;L;004B 0327;;;;N;LATIN CAPITAL LETTER K CEDILLA;;;0137;
-0137;LATIN SMALL LETTER K WITH CEDILLA;Ll;0;L;006B 0327;;;;N;LATIN SMALL LETTER K CEDILLA;;0136;;0136
-0138;LATIN SMALL LETTER KRA;Ll;0;L;;;;;N;;;;;
-0139;LATIN CAPITAL LETTER L WITH ACUTE;Lu;0;L;004C 0301;;;;N;LATIN CAPITAL LETTER L ACUTE;;;013A;
-013A;LATIN SMALL LETTER L WITH ACUTE;Ll;0;L;006C 0301;;;;N;LATIN SMALL LETTER L ACUTE;;0139;;0139
-013B;LATIN CAPITAL LETTER L WITH CEDILLA;Lu;0;L;004C 0327;;;;N;LATIN CAPITAL LETTER L CEDILLA;;;013C;
-013C;LATIN SMALL LETTER L WITH CEDILLA;Ll;0;L;006C 0327;;;;N;LATIN SMALL LETTER L CEDILLA;;013B;;013B
-013D;LATIN CAPITAL LETTER L WITH CARON;Lu;0;L;004C 030C;;;;N;LATIN CAPITAL LETTER L HACEK;;;013E;
-013E;LATIN SMALL LETTER L WITH CARON;Ll;0;L;006C 030C;;;;N;LATIN SMALL LETTER L HACEK;;013D;;013D
-013F;LATIN CAPITAL LETTER L WITH MIDDLE DOT;Lu;0;L; 004C 00B7;;;;N;;;;0140;
-0140;LATIN SMALL LETTER L WITH MIDDLE DOT;Ll;0;L; 006C 00B7;;;;N;;;013F;;013F
-0141;LATIN CAPITAL LETTER L WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER L SLASH;;;0142;
-0142;LATIN SMALL LETTER L WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER L SLASH;;0141;;0141
-0143;LATIN CAPITAL LETTER N WITH ACUTE;Lu;0;L;004E 0301;;;;N;LATIN CAPITAL LETTER N ACUTE;;;0144;
-0144;LATIN SMALL LETTER N WITH ACUTE;Ll;0;L;006E 0301;;;;N;LATIN SMALL LETTER N ACUTE;;0143;;0143
-0145;LATIN CAPITAL LETTER N WITH CEDILLA;Lu;0;L;004E 0327;;;;N;LATIN CAPITAL LETTER N CEDILLA;;;0146;
-0146;LATIN SMALL LETTER N WITH CEDILLA;Ll;0;L;006E 0327;;;;N;LATIN SMALL LETTER N CEDILLA;;0145;;0145
-0147;LATIN CAPITAL LETTER N WITH CARON;Lu;0;L;004E 030C;;;;N;LATIN CAPITAL LETTER N HACEK;;;0148;
-0148;LATIN SMALL LETTER N WITH CARON;Ll;0;L;006E 030C;;;;N;LATIN SMALL LETTER N HACEK;;0147;;0147
-0149;LATIN SMALL LETTER N PRECEDED BY APOSTROPHE;Ll;0;L; 02BC 006E;;;;N;LATIN SMALL LETTER APOSTROPHE N;;;;
-014A;LATIN CAPITAL LETTER ENG;Lu;0;L;;;;;N;;;;014B;
-014B;LATIN SMALL LETTER ENG;Ll;0;L;;;;;N;;;014A;;014A
-014C;LATIN CAPITAL LETTER O WITH MACRON;Lu;0;L;004F 0304;;;;N;LATIN CAPITAL LETTER O MACRON;;;014D;
-014D;LATIN SMALL LETTER O WITH MACRON;Ll;0;L;006F 0304;;;;N;LATIN SMALL LETTER O MACRON;;014C;;014C
-014E;LATIN CAPITAL LETTER O WITH BREVE;Lu;0;L;004F 0306;;;;N;LATIN CAPITAL LETTER O BREVE;;;014F;
-014F;LATIN SMALL LETTER O WITH BREVE;Ll;0;L;006F 0306;;;;N;LATIN SMALL LETTER O BREVE;;014E;;014E
-0150;LATIN CAPITAL LETTER O WITH DOUBLE ACUTE;Lu;0;L;004F 030B;;;;N;LATIN CAPITAL LETTER O DOUBLE ACUTE;;;0151;
-0151;LATIN SMALL LETTER O WITH DOUBLE ACUTE;Ll;0;L;006F 030B;;;;N;LATIN SMALL LETTER O DOUBLE ACUTE;;0150;;0150
-0152;LATIN CAPITAL LIGATURE OE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O E;;;0153;
-0153;LATIN SMALL LIGATURE OE;Ll;0;L;;;;;N;LATIN SMALL LETTER O E;;0152;;0152
-0154;LATIN CAPITAL LETTER R WITH ACUTE;Lu;0;L;0052 0301;;;;N;LATIN CAPITAL LETTER R ACUTE;;;0155;
-0155;LATIN SMALL LETTER R WITH ACUTE;Ll;0;L;0072 0301;;;;N;LATIN SMALL LETTER R ACUTE;;0154;;0154
-0156;LATIN CAPITAL LETTER R WITH CEDILLA;Lu;0;L;0052 0327;;;;N;LATIN CAPITAL LETTER R CEDILLA;;;0157;
-0157;LATIN SMALL LETTER R WITH CEDILLA;Ll;0;L;0072 0327;;;;N;LATIN SMALL LETTER R CEDILLA;;0156;;0156
-0158;LATIN CAPITAL LETTER R WITH CARON;Lu;0;L;0052 030C;;;;N;LATIN CAPITAL LETTER R HACEK;;;0159;
-0159;LATIN SMALL LETTER R WITH CARON;Ll;0;L;0072 030C;;;;N;LATIN SMALL LETTER R HACEK;;0158;;0158
-015A;LATIN CAPITAL LETTER S WITH ACUTE;Lu;0;L;0053 0301;;;;N;LATIN CAPITAL LETTER S ACUTE;;;015B;
-015B;LATIN SMALL LETTER S WITH ACUTE;Ll;0;L;0073 0301;;;;N;LATIN SMALL LETTER S ACUTE;;015A;;015A
-015C;LATIN CAPITAL LETTER S WITH CIRCUMFLEX;Lu;0;L;0053 0302;;;;N;LATIN CAPITAL LETTER S CIRCUMFLEX;;;015D;
-015D;LATIN SMALL LETTER S WITH CIRCUMFLEX;Ll;0;L;0073 0302;;;;N;LATIN SMALL LETTER S CIRCUMFLEX;;015C;;015C
-015E;LATIN CAPITAL LETTER S WITH CEDILLA;Lu;0;L;0053 0327;;;;N;LATIN CAPITAL LETTER S CEDILLA;;;015F;
-015F;LATIN SMALL LETTER S WITH CEDILLA;Ll;0;L;0073 0327;;;;N;LATIN SMALL LETTER S CEDILLA;;015E;;015E
-0160;LATIN CAPITAL LETTER S WITH CARON;Lu;0;L;0053 030C;;;;N;LATIN CAPITAL LETTER S HACEK;;;0161;
-0161;LATIN SMALL LETTER S WITH CARON;Ll;0;L;0073 030C;;;;N;LATIN SMALL LETTER S HACEK;;0160;;0160
-0162;LATIN CAPITAL LETTER T WITH CEDILLA;Lu;0;L;0054 0327;;;;N;LATIN CAPITAL LETTER T CEDILLA;;;0163;
-0163;LATIN SMALL LETTER T WITH CEDILLA;Ll;0;L;0074 0327;;;;N;LATIN SMALL LETTER T CEDILLA;;0162;;0162
-0164;LATIN CAPITAL LETTER T WITH CARON;Lu;0;L;0054 030C;;;;N;LATIN CAPITAL LETTER T HACEK;;;0165;
-0165;LATIN SMALL LETTER T WITH CARON;Ll;0;L;0074 030C;;;;N;LATIN SMALL LETTER T HACEK;;0164;;0164
-0166;LATIN CAPITAL LETTER T WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T BAR;;;0167;
-0167;LATIN SMALL LETTER T WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER T BAR;;0166;;0166
-0168;LATIN CAPITAL LETTER U WITH TILDE;Lu;0;L;0055 0303;;;;N;LATIN CAPITAL LETTER U TILDE;;;0169;
-0169;LATIN SMALL LETTER U WITH TILDE;Ll;0;L;0075 0303;;;;N;LATIN SMALL LETTER U TILDE;;0168;;0168
-016A;LATIN CAPITAL LETTER U WITH MACRON;Lu;0;L;0055 0304;;;;N;LATIN CAPITAL LETTER U MACRON;;;016B;
-016B;LATIN SMALL LETTER U WITH MACRON;Ll;0;L;0075 0304;;;;N;LATIN SMALL LETTER U MACRON;;016A;;016A
-016C;LATIN CAPITAL LETTER U WITH BREVE;Lu;0;L;0055 0306;;;;N;LATIN CAPITAL LETTER U BREVE;;;016D;
-016D;LATIN SMALL LETTER U WITH BREVE;Ll;0;L;0075 0306;;;;N;LATIN SMALL LETTER U BREVE;;016C;;016C
-016E;LATIN CAPITAL LETTER U WITH RING ABOVE;Lu;0;L;0055 030A;;;;N;LATIN CAPITAL LETTER U RING;;;016F;
-016F;LATIN SMALL LETTER U WITH RING ABOVE;Ll;0;L;0075 030A;;;;N;LATIN SMALL LETTER U RING;;016E;;016E
-0170;LATIN CAPITAL LETTER U WITH DOUBLE ACUTE;Lu;0;L;0055 030B;;;;N;LATIN CAPITAL LETTER U DOUBLE ACUTE;;;0171;
-0171;LATIN SMALL LETTER U WITH DOUBLE ACUTE;Ll;0;L;0075 030B;;;;N;LATIN SMALL LETTER U DOUBLE ACUTE;;0170;;0170
-0172;LATIN CAPITAL LETTER U WITH OGONEK;Lu;0;L;0055 0328;;;;N;LATIN CAPITAL LETTER U OGONEK;;;0173;
-0173;LATIN SMALL LETTER U WITH OGONEK;Ll;0;L;0075 0328;;;;N;LATIN SMALL LETTER U OGONEK;;0172;;0172
-0174;LATIN CAPITAL LETTER W WITH CIRCUMFLEX;Lu;0;L;0057 0302;;;;N;LATIN CAPITAL LETTER W CIRCUMFLEX;;;0175;
-0175;LATIN SMALL LETTER W WITH CIRCUMFLEX;Ll;0;L;0077 0302;;;;N;LATIN SMALL LETTER W CIRCUMFLEX;;0174;;0174
-0176;LATIN CAPITAL LETTER Y WITH CIRCUMFLEX;Lu;0;L;0059 0302;;;;N;LATIN CAPITAL LETTER Y CIRCUMFLEX;;;0177;
-0177;LATIN SMALL LETTER Y WITH CIRCUMFLEX;Ll;0;L;0079 0302;;;;N;LATIN SMALL LETTER Y CIRCUMFLEX;;0176;;0176
-0178;LATIN CAPITAL LETTER Y WITH DIAERESIS;Lu;0;L;0059 0308;;;;N;LATIN CAPITAL LETTER Y DIAERESIS;;;00FF;
-0179;LATIN CAPITAL LETTER Z WITH ACUTE;Lu;0;L;005A 0301;;;;N;LATIN CAPITAL LETTER Z ACUTE;;;017A;
-017A;LATIN SMALL LETTER Z WITH ACUTE;Ll;0;L;007A 0301;;;;N;LATIN SMALL LETTER Z ACUTE;;0179;;0179
-017B;LATIN CAPITAL LETTER Z WITH DOT ABOVE;Lu;0;L;005A 0307;;;;N;LATIN CAPITAL LETTER Z DOT;;;017C;
-017C;LATIN SMALL LETTER Z WITH DOT ABOVE;Ll;0;L;007A 0307;;;;N;LATIN SMALL LETTER Z DOT;;017B;;017B
-017D;LATIN CAPITAL LETTER Z WITH CARON;Lu;0;L;005A 030C;;;;N;LATIN CAPITAL LETTER Z HACEK;;;017E;
-017E;LATIN SMALL LETTER Z WITH CARON;Ll;0;L;007A 030C;;;;N;LATIN SMALL LETTER Z HACEK;;017D;;017D
-017F;LATIN SMALL LETTER LONG S;Ll;0;L; 0073;;;;N;;;0053;;0053
-0180;LATIN SMALL LETTER B WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER B BAR;;0243;;0243
-0181;LATIN CAPITAL LETTER B WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B HOOK;;;0253;
-0182;LATIN CAPITAL LETTER B WITH TOPBAR;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B TOPBAR;;;0183;
-0183;LATIN SMALL LETTER B WITH TOPBAR;Ll;0;L;;;;;N;LATIN SMALL LETTER B TOPBAR;;0182;;0182
-0184;LATIN CAPITAL LETTER TONE SIX;Lu;0;L;;;;;N;;;;0185;
-0185;LATIN SMALL LETTER TONE SIX;Ll;0;L;;;;;N;;;0184;;0184
-0186;LATIN CAPITAL LETTER OPEN O;Lu;0;L;;;;;N;;;;0254;
-0187;LATIN CAPITAL LETTER C WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER C HOOK;;;0188;
-0188;LATIN SMALL LETTER C WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER C HOOK;;0187;;0187
-0189;LATIN CAPITAL LETTER AFRICAN D;Lu;0;L;;;;;N;;;;0256;
-018A;LATIN CAPITAL LETTER D WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D HOOK;;;0257;
-018B;LATIN CAPITAL LETTER D WITH TOPBAR;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D TOPBAR;;;018C;
-018C;LATIN SMALL LETTER D WITH TOPBAR;Ll;0;L;;;;;N;LATIN SMALL LETTER D TOPBAR;;018B;;018B
-018D;LATIN SMALL LETTER TURNED DELTA;Ll;0;L;;;;;N;;;;;
-018E;LATIN CAPITAL LETTER REVERSED E;Lu;0;L;;;;;N;LATIN CAPITAL LETTER TURNED E;;;01DD;
-018F;LATIN CAPITAL LETTER SCHWA;Lu;0;L;;;;;N;;;;0259;
-0190;LATIN CAPITAL LETTER OPEN E;Lu;0;L;;;;;N;LATIN CAPITAL LETTER EPSILON;;;025B;
-0191;LATIN CAPITAL LETTER F WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER F HOOK;;;0192;
-0192;LATIN SMALL LETTER F WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT F;;0191;;0191
-0193;LATIN CAPITAL LETTER G WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER G HOOK;;;0260;
-0194;LATIN CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;0263;
-0195;LATIN SMALL LETTER HV;Ll;0;L;;;;;N;LATIN SMALL LETTER H V;;01F6;;01F6
-0196;LATIN CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;0269;
-0197;LATIN CAPITAL LETTER I WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER BARRED I;;;0268;
-0198;LATIN CAPITAL LETTER K WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER K HOOK;;;0199;
-0199;LATIN SMALL LETTER K WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER K HOOK;;0198;;0198
-019A;LATIN SMALL LETTER L WITH BAR;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED L;;023D;;023D
-019B;LATIN SMALL LETTER LAMBDA WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED LAMBDA;;;;
-019C;LATIN CAPITAL LETTER TURNED M;Lu;0;L;;;;;N;;;;026F;
-019D;LATIN CAPITAL LETTER N WITH LEFT HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER N HOOK;;;0272;
-019E;LATIN SMALL LETTER N WITH LONG RIGHT LEG;Ll;0;L;;;;;N;;;0220;;0220
-019F;LATIN CAPITAL LETTER O WITH MIDDLE TILDE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER BARRED O;;;0275;
-01A0;LATIN CAPITAL LETTER O WITH HORN;Lu;0;L;004F 031B;;;;N;LATIN CAPITAL LETTER O HORN;;;01A1;
-01A1;LATIN SMALL LETTER O WITH HORN;Ll;0;L;006F 031B;;;;N;LATIN SMALL LETTER O HORN;;01A0;;01A0
-01A2;LATIN CAPITAL LETTER OI;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O I;;;01A3;
-01A3;LATIN SMALL LETTER OI;Ll;0;L;;;;;N;LATIN SMALL LETTER O I;;01A2;;01A2
-01A4;LATIN CAPITAL LETTER P WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER P HOOK;;;01A5;
-01A5;LATIN SMALL LETTER P WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER P HOOK;;01A4;;01A4
-01A6;LATIN LETTER YR;Lu;0;L;;;;;N;LATIN LETTER Y R;;;0280;
-01A7;LATIN CAPITAL LETTER TONE TWO;Lu;0;L;;;;;N;;;;01A8;
-01A8;LATIN SMALL LETTER TONE TWO;Ll;0;L;;;;;N;;;01A7;;01A7
-01A9;LATIN CAPITAL LETTER ESH;Lu;0;L;;;;;N;;;;0283;
-01AA;LATIN LETTER REVERSED ESH LOOP;Ll;0;L;;;;;N;;;;;
-01AB;LATIN SMALL LETTER T WITH PALATAL HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T PALATAL HOOK;;;;
-01AC;LATIN CAPITAL LETTER T WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T HOOK;;;01AD;
-01AD;LATIN SMALL LETTER T WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T HOOK;;01AC;;01AC
-01AE;LATIN CAPITAL LETTER T WITH RETROFLEX HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T RETROFLEX HOOK;;;0288;
-01AF;LATIN CAPITAL LETTER U WITH HORN;Lu;0;L;0055 031B;;;;N;LATIN CAPITAL LETTER U HORN;;;01B0;
-01B0;LATIN SMALL LETTER U WITH HORN;Ll;0;L;0075 031B;;;;N;LATIN SMALL LETTER U HORN;;01AF;;01AF
-01B1;LATIN CAPITAL LETTER UPSILON;Lu;0;L;;;;;N;;;;028A;
-01B2;LATIN CAPITAL LETTER V WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER SCRIPT V;;;028B;
-01B3;LATIN CAPITAL LETTER Y WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER Y HOOK;;;01B4;
-01B4;LATIN SMALL LETTER Y WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Y HOOK;;01B3;;01B3
-01B5;LATIN CAPITAL LETTER Z WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER Z BAR;;;01B6;
-01B6;LATIN SMALL LETTER Z WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER Z BAR;;01B5;;01B5
-01B7;LATIN CAPITAL LETTER EZH;Lu;0;L;;;;;N;LATIN CAPITAL LETTER YOGH;;;0292;
-01B8;LATIN CAPITAL LETTER EZH REVERSED;Lu;0;L;;;;;N;LATIN CAPITAL LETTER REVERSED YOGH;;;01B9;
-01B9;LATIN SMALL LETTER EZH REVERSED;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED YOGH;;01B8;;01B8
-01BA;LATIN SMALL LETTER EZH WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH WITH TAIL;;;;
-01BB;LATIN LETTER TWO WITH STROKE;Lo;0;L;;;;;N;LATIN LETTER TWO BAR;;;;
-01BC;LATIN CAPITAL LETTER TONE FIVE;Lu;0;L;;;;;N;;;;01BD;
-01BD;LATIN SMALL LETTER TONE FIVE;Ll;0;L;;;;;N;;;01BC;;01BC
-01BE;LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER INVERTED GLOTTAL STOP BAR;;;;
-01BF;LATIN LETTER WYNN;Ll;0;L;;;;;N;;;01F7;;01F7
-01C0;LATIN LETTER DENTAL CLICK;Lo;0;L;;;;;N;LATIN LETTER PIPE;;;;
-01C1;LATIN LETTER LATERAL CLICK;Lo;0;L;;;;;N;LATIN LETTER DOUBLE PIPE;;;;
-01C2;LATIN LETTER ALVEOLAR CLICK;Lo;0;L;;;;;N;LATIN LETTER PIPE DOUBLE BAR;;;;
-01C3;LATIN LETTER RETROFLEX CLICK;Lo;0;L;;;;;N;LATIN LETTER EXCLAMATION MARK;;;;
-01C4;LATIN CAPITAL LETTER DZ WITH CARON;Lu;0;L; 0044 017D;;;;N;LATIN CAPITAL LETTER D Z HACEK;;;01C6;01C5
-01C5;LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON;Lt;0;L; 0044 017E;;;;N;LATIN LETTER CAPITAL D SMALL Z HACEK;;01C4;01C6;01C5
-01C6;LATIN SMALL LETTER DZ WITH CARON;Ll;0;L; 0064 017E;;;;N;LATIN SMALL LETTER D Z HACEK;;01C4;;01C5
-01C7;LATIN CAPITAL LETTER LJ;Lu;0;L; 004C 004A;;;;N;LATIN CAPITAL LETTER L J;;;01C9;01C8
-01C8;LATIN CAPITAL LETTER L WITH SMALL LETTER J;Lt;0;L; 004C 006A;;;;N;LATIN LETTER CAPITAL L SMALL J;;01C7;01C9;01C8
-01C9;LATIN SMALL LETTER LJ;Ll;0;L; 006C 006A;;;;N;LATIN SMALL LETTER L J;;01C7;;01C8
-01CA;LATIN CAPITAL LETTER NJ;Lu;0;L; 004E 004A;;;;N;LATIN CAPITAL LETTER N J;;;01CC;01CB
-01CB;LATIN CAPITAL LETTER N WITH SMALL LETTER J;Lt;0;L; 004E 006A;;;;N;LATIN LETTER CAPITAL N SMALL J;;01CA;01CC;01CB
-01CC;LATIN SMALL LETTER NJ;Ll;0;L; 006E 006A;;;;N;LATIN SMALL LETTER N J;;01CA;;01CB
-01CD;LATIN CAPITAL LETTER A WITH CARON;Lu;0;L;0041 030C;;;;N;LATIN CAPITAL LETTER A HACEK;;;01CE;
-01CE;LATIN SMALL LETTER A WITH CARON;Ll;0;L;0061 030C;;;;N;LATIN SMALL LETTER A HACEK;;01CD;;01CD
-01CF;LATIN CAPITAL LETTER I WITH CARON;Lu;0;L;0049 030C;;;;N;LATIN CAPITAL LETTER I HACEK;;;01D0;
-01D0;LATIN SMALL LETTER I WITH CARON;Ll;0;L;0069 030C;;;;N;LATIN SMALL LETTER I HACEK;;01CF;;01CF
-01D1;LATIN CAPITAL LETTER O WITH CARON;Lu;0;L;004F 030C;;;;N;LATIN CAPITAL LETTER O HACEK;;;01D2;
-01D2;LATIN SMALL LETTER O WITH CARON;Ll;0;L;006F 030C;;;;N;LATIN SMALL LETTER O HACEK;;01D1;;01D1
-01D3;LATIN CAPITAL LETTER U WITH CARON;Lu;0;L;0055 030C;;;;N;LATIN CAPITAL LETTER U HACEK;;;01D4;
-01D4;LATIN SMALL LETTER U WITH CARON;Ll;0;L;0075 030C;;;;N;LATIN SMALL LETTER U HACEK;;01D3;;01D3
-01D5;LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON;Lu;0;L;00DC 0304;;;;N;LATIN CAPITAL LETTER U DIAERESIS MACRON;;;01D6;
-01D6;LATIN SMALL LETTER U WITH DIAERESIS AND MACRON;Ll;0;L;00FC 0304;;;;N;LATIN SMALL LETTER U DIAERESIS MACRON;;01D5;;01D5
-01D7;LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE;Lu;0;L;00DC 0301;;;;N;LATIN CAPITAL LETTER U DIAERESIS ACUTE;;;01D8;
-01D8;LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE;Ll;0;L;00FC 0301;;;;N;LATIN SMALL LETTER U DIAERESIS ACUTE;;01D7;;01D7
-01D9;LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON;Lu;0;L;00DC 030C;;;;N;LATIN CAPITAL LETTER U DIAERESIS HACEK;;;01DA;
-01DA;LATIN SMALL LETTER U WITH DIAERESIS AND CARON;Ll;0;L;00FC 030C;;;;N;LATIN SMALL LETTER U DIAERESIS HACEK;;01D9;;01D9
-01DB;LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE;Lu;0;L;00DC 0300;;;;N;LATIN CAPITAL LETTER U DIAERESIS GRAVE;;;01DC;
-01DC;LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE;Ll;0;L;00FC 0300;;;;N;LATIN SMALL LETTER U DIAERESIS GRAVE;;01DB;;01DB
-01DD;LATIN SMALL LETTER TURNED E;Ll;0;L;;;;;N;;;018E;;018E
-01DE;LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON;Lu;0;L;00C4 0304;;;;N;LATIN CAPITAL LETTER A DIAERESIS MACRON;;;01DF;
-01DF;LATIN SMALL LETTER A WITH DIAERESIS AND MACRON;Ll;0;L;00E4 0304;;;;N;LATIN SMALL LETTER A DIAERESIS MACRON;;01DE;;01DE
-01E0;LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON;Lu;0;L;0226 0304;;;;N;LATIN CAPITAL LETTER A DOT MACRON;;;01E1;
-01E1;LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON;Ll;0;L;0227 0304;;;;N;LATIN SMALL LETTER A DOT MACRON;;01E0;;01E0
-01E2;LATIN CAPITAL LETTER AE WITH MACRON;Lu;0;L;00C6 0304;;;;N;LATIN CAPITAL LETTER A E MACRON;;;01E3;
-01E3;LATIN SMALL LETTER AE WITH MACRON;Ll;0;L;00E6 0304;;;;N;LATIN SMALL LETTER A E MACRON;;01E2;;01E2
-01E4;LATIN CAPITAL LETTER G WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER G BAR;;;01E5;
-01E5;LATIN SMALL LETTER G WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER G BAR;;01E4;;01E4
-01E6;LATIN CAPITAL LETTER G WITH CARON;Lu;0;L;0047 030C;;;;N;LATIN CAPITAL LETTER G HACEK;;;01E7;
-01E7;LATIN SMALL LETTER G WITH CARON;Ll;0;L;0067 030C;;;;N;LATIN SMALL LETTER G HACEK;;01E6;;01E6
-01E8;LATIN CAPITAL LETTER K WITH CARON;Lu;0;L;004B 030C;;;;N;LATIN CAPITAL LETTER K HACEK;;;01E9;
-01E9;LATIN SMALL LETTER K WITH CARON;Ll;0;L;006B 030C;;;;N;LATIN SMALL LETTER K HACEK;;01E8;;01E8
-01EA;LATIN CAPITAL LETTER O WITH OGONEK;Lu;0;L;004F 0328;;;;N;LATIN CAPITAL LETTER O OGONEK;;;01EB;
-01EB;LATIN SMALL LETTER O WITH OGONEK;Ll;0;L;006F 0328;;;;N;LATIN SMALL LETTER O OGONEK;;01EA;;01EA
-01EC;LATIN CAPITAL LETTER O WITH OGONEK AND MACRON;Lu;0;L;01EA 0304;;;;N;LATIN CAPITAL LETTER O OGONEK MACRON;;;01ED;
-01ED;LATIN SMALL LETTER O WITH OGONEK AND MACRON;Ll;0;L;01EB 0304;;;;N;LATIN SMALL LETTER O OGONEK MACRON;;01EC;;01EC
-01EE;LATIN CAPITAL LETTER EZH WITH CARON;Lu;0;L;01B7 030C;;;;N;LATIN CAPITAL LETTER YOGH HACEK;;;01EF;
-01EF;LATIN SMALL LETTER EZH WITH CARON;Ll;0;L;0292 030C;;;;N;LATIN SMALL LETTER YOGH HACEK;;01EE;;01EE
-01F0;LATIN SMALL LETTER J WITH CARON;Ll;0;L;006A 030C;;;;N;LATIN SMALL LETTER J HACEK;;;;
-01F1;LATIN CAPITAL LETTER DZ;Lu;0;L; 0044 005A;;;;N;;;;01F3;01F2
-01F2;LATIN CAPITAL LETTER D WITH SMALL LETTER Z;Lt;0;L; 0044 007A;;;;N;;;01F1;01F3;01F2
-01F3;LATIN SMALL LETTER DZ;Ll;0;L; 0064 007A;;;;N;;;01F1;;01F2
-01F4;LATIN CAPITAL LETTER G WITH ACUTE;Lu;0;L;0047 0301;;;;N;;;;01F5;
-01F5;LATIN SMALL LETTER G WITH ACUTE;Ll;0;L;0067 0301;;;;N;;;01F4;;01F4
-01F6;LATIN CAPITAL LETTER HWAIR;Lu;0;L;;;;;N;;;;0195;
-01F7;LATIN CAPITAL LETTER WYNN;Lu;0;L;;;;;N;;;;01BF;
-01F8;LATIN CAPITAL LETTER N WITH GRAVE;Lu;0;L;004E 0300;;;;N;;;;01F9;
-01F9;LATIN SMALL LETTER N WITH GRAVE;Ll;0;L;006E 0300;;;;N;;;01F8;;01F8
-01FA;LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE;Lu;0;L;00C5 0301;;;;N;;;;01FB;
-01FB;LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE;Ll;0;L;00E5 0301;;;;N;;;01FA;;01FA
-01FC;LATIN CAPITAL LETTER AE WITH ACUTE;Lu;0;L;00C6 0301;;;;N;;;;01FD;
-01FD;LATIN SMALL LETTER AE WITH ACUTE;Ll;0;L;00E6 0301;;;;N;;;01FC;;01FC
-01FE;LATIN CAPITAL LETTER O WITH STROKE AND ACUTE;Lu;0;L;00D8 0301;;;;N;;;;01FF;
-01FF;LATIN SMALL LETTER O WITH STROKE AND ACUTE;Ll;0;L;00F8 0301;;;;N;;;01FE;;01FE
-0200;LATIN CAPITAL LETTER A WITH DOUBLE GRAVE;Lu;0;L;0041 030F;;;;N;;;;0201;
-0201;LATIN SMALL LETTER A WITH DOUBLE GRAVE;Ll;0;L;0061 030F;;;;N;;;0200;;0200
-0202;LATIN CAPITAL LETTER A WITH INVERTED BREVE;Lu;0;L;0041 0311;;;;N;;;;0203;
-0203;LATIN SMALL LETTER A WITH INVERTED BREVE;Ll;0;L;0061 0311;;;;N;;;0202;;0202
-0204;LATIN CAPITAL LETTER E WITH DOUBLE GRAVE;Lu;0;L;0045 030F;;;;N;;;;0205;
-0205;LATIN SMALL LETTER E WITH DOUBLE GRAVE;Ll;0;L;0065 030F;;;;N;;;0204;;0204
-0206;LATIN CAPITAL LETTER E WITH INVERTED BREVE;Lu;0;L;0045 0311;;;;N;;;;0207;
-0207;LATIN SMALL LETTER E WITH INVERTED BREVE;Ll;0;L;0065 0311;;;;N;;;0206;;0206
-0208;LATIN CAPITAL LETTER I WITH DOUBLE GRAVE;Lu;0;L;0049 030F;;;;N;;;;0209;
-0209;LATIN SMALL LETTER I WITH DOUBLE GRAVE;Ll;0;L;0069 030F;;;;N;;;0208;;0208
-020A;LATIN CAPITAL LETTER I WITH INVERTED BREVE;Lu;0;L;0049 0311;;;;N;;;;020B;
-020B;LATIN SMALL LETTER I WITH INVERTED BREVE;Ll;0;L;0069 0311;;;;N;;;020A;;020A
-020C;LATIN CAPITAL LETTER O WITH DOUBLE GRAVE;Lu;0;L;004F 030F;;;;N;;;;020D;
-020D;LATIN SMALL LETTER O WITH DOUBLE GRAVE;Ll;0;L;006F 030F;;;;N;;;020C;;020C
-020E;LATIN CAPITAL LETTER O WITH INVERTED BREVE;Lu;0;L;004F 0311;;;;N;;;;020F;
-020F;LATIN SMALL LETTER O WITH INVERTED BREVE;Ll;0;L;006F 0311;;;;N;;;020E;;020E
-0210;LATIN CAPITAL LETTER R WITH DOUBLE GRAVE;Lu;0;L;0052 030F;;;;N;;;;0211;
-0211;LATIN SMALL LETTER R WITH DOUBLE GRAVE;Ll;0;L;0072 030F;;;;N;;;0210;;0210
-0212;LATIN CAPITAL LETTER R WITH INVERTED BREVE;Lu;0;L;0052 0311;;;;N;;;;0213;
-0213;LATIN SMALL LETTER R WITH INVERTED BREVE;Ll;0;L;0072 0311;;;;N;;;0212;;0212
-0214;LATIN CAPITAL LETTER U WITH DOUBLE GRAVE;Lu;0;L;0055 030F;;;;N;;;;0215;
-0215;LATIN SMALL LETTER U WITH DOUBLE GRAVE;Ll;0;L;0075 030F;;;;N;;;0214;;0214
-0216;LATIN CAPITAL LETTER U WITH INVERTED BREVE;Lu;0;L;0055 0311;;;;N;;;;0217;
-0217;LATIN SMALL LETTER U WITH INVERTED BREVE;Ll;0;L;0075 0311;;;;N;;;0216;;0216
-0218;LATIN CAPITAL LETTER S WITH COMMA BELOW;Lu;0;L;0053 0326;;;;N;;;;0219;
-0219;LATIN SMALL LETTER S WITH COMMA BELOW;Ll;0;L;0073 0326;;;;N;;;0218;;0218
-021A;LATIN CAPITAL LETTER T WITH COMMA BELOW;Lu;0;L;0054 0326;;;;N;;;;021B;
-021B;LATIN SMALL LETTER T WITH COMMA BELOW;Ll;0;L;0074 0326;;;;N;;;021A;;021A
-021C;LATIN CAPITAL LETTER YOGH;Lu;0;L;;;;;N;;;;021D;
-021D;LATIN SMALL LETTER YOGH;Ll;0;L;;;;;N;;;021C;;021C
-021E;LATIN CAPITAL LETTER H WITH CARON;Lu;0;L;0048 030C;;;;N;;;;021F;
-021F;LATIN SMALL LETTER H WITH CARON;Ll;0;L;0068 030C;;;;N;;;021E;;021E
-0220;LATIN CAPITAL LETTER N WITH LONG RIGHT LEG;Lu;0;L;;;;;N;;;;019E;
-0221;LATIN SMALL LETTER D WITH CURL;Ll;0;L;;;;;N;;;;;
-0222;LATIN CAPITAL LETTER OU;Lu;0;L;;;;;N;;;;0223;
-0223;LATIN SMALL LETTER OU;Ll;0;L;;;;;N;;;0222;;0222
-0224;LATIN CAPITAL LETTER Z WITH HOOK;Lu;0;L;;;;;N;;;;0225;
-0225;LATIN SMALL LETTER Z WITH HOOK;Ll;0;L;;;;;N;;;0224;;0224
-0226;LATIN CAPITAL LETTER A WITH DOT ABOVE;Lu;0;L;0041 0307;;;;N;;;;0227;
-0227;LATIN SMALL LETTER A WITH DOT ABOVE;Ll;0;L;0061 0307;;;;N;;;0226;;0226
-0228;LATIN CAPITAL LETTER E WITH CEDILLA;Lu;0;L;0045 0327;;;;N;;;;0229;
-0229;LATIN SMALL LETTER E WITH CEDILLA;Ll;0;L;0065 0327;;;;N;;;0228;;0228
-022A;LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON;Lu;0;L;00D6 0304;;;;N;;;;022B;
-022B;LATIN SMALL LETTER O WITH DIAERESIS AND MACRON;Ll;0;L;00F6 0304;;;;N;;;022A;;022A
-022C;LATIN CAPITAL LETTER O WITH TILDE AND MACRON;Lu;0;L;00D5 0304;;;;N;;;;022D;
-022D;LATIN SMALL LETTER O WITH TILDE AND MACRON;Ll;0;L;00F5 0304;;;;N;;;022C;;022C
-022E;LATIN CAPITAL LETTER O WITH DOT ABOVE;Lu;0;L;004F 0307;;;;N;;;;022F;
-022F;LATIN SMALL LETTER O WITH DOT ABOVE;Ll;0;L;006F 0307;;;;N;;;022E;;022E
-0230;LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON;Lu;0;L;022E 0304;;;;N;;;;0231;
-0231;LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON;Ll;0;L;022F 0304;;;;N;;;0230;;0230
-0232;LATIN CAPITAL LETTER Y WITH MACRON;Lu;0;L;0059 0304;;;;N;;;;0233;
-0233;LATIN SMALL LETTER Y WITH MACRON;Ll;0;L;0079 0304;;;;N;;;0232;;0232
-0234;LATIN SMALL LETTER L WITH CURL;Ll;0;L;;;;;N;;;;;
-0235;LATIN SMALL LETTER N WITH CURL;Ll;0;L;;;;;N;;;;;
-0236;LATIN SMALL LETTER T WITH CURL;Ll;0;L;;;;;N;;;;;
-0237;LATIN SMALL LETTER DOTLESS J;Ll;0;L;;;;;N;;;;;
-0238;LATIN SMALL LETTER DB DIGRAPH;Ll;0;L;;;;;N;;;;;
-0239;LATIN SMALL LETTER QP DIGRAPH;Ll;0;L;;;;;N;;;;;
-023A;LATIN CAPITAL LETTER A WITH STROKE;Lu;0;L;;;;;N;;;;2C65;
-023B;LATIN CAPITAL LETTER C WITH STROKE;Lu;0;L;;;;;N;;;;023C;
-023C;LATIN SMALL LETTER C WITH STROKE;Ll;0;L;;;;;N;;;023B;;023B
-023D;LATIN CAPITAL LETTER L WITH BAR;Lu;0;L;;;;;N;;;;019A;
-023E;LATIN CAPITAL LETTER T WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;2C66;
-023F;LATIN SMALL LETTER S WITH SWASH TAIL;Ll;0;L;;;;;N;;;2C7E;;2C7E
-0240;LATIN SMALL LETTER Z WITH SWASH TAIL;Ll;0;L;;;;;N;;;2C7F;;2C7F
-0241;LATIN CAPITAL LETTER GLOTTAL STOP;Lu;0;L;;;;;N;;;;0242;
-0242;LATIN SMALL LETTER GLOTTAL STOP;Ll;0;L;;;;;N;;;0241;;0241
-0243;LATIN CAPITAL LETTER B WITH STROKE;Lu;0;L;;;;;N;;;;0180;
-0244;LATIN CAPITAL LETTER U BAR;Lu;0;L;;;;;N;;;;0289;
-0245;LATIN CAPITAL LETTER TURNED V;Lu;0;L;;;;;N;;;;028C;
-0246;LATIN CAPITAL LETTER E WITH STROKE;Lu;0;L;;;;;N;;;;0247;
-0247;LATIN SMALL LETTER E WITH STROKE;Ll;0;L;;;;;N;;;0246;;0246
-0248;LATIN CAPITAL LETTER J WITH STROKE;Lu;0;L;;;;;N;;;;0249;
-0249;LATIN SMALL LETTER J WITH STROKE;Ll;0;L;;;;;N;;;0248;;0248
-024A;LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL;Lu;0;L;;;;;N;;;;024B;
-024B;LATIN SMALL LETTER Q WITH HOOK TAIL;Ll;0;L;;;;;N;;;024A;;024A
-024C;LATIN CAPITAL LETTER R WITH STROKE;Lu;0;L;;;;;N;;;;024D;
-024D;LATIN SMALL LETTER R WITH STROKE;Ll;0;L;;;;;N;;;024C;;024C
-024E;LATIN CAPITAL LETTER Y WITH STROKE;Lu;0;L;;;;;N;;;;024F;
-024F;LATIN SMALL LETTER Y WITH STROKE;Ll;0;L;;;;;N;;;024E;;024E
-0250;LATIN SMALL LETTER TURNED A;Ll;0;L;;;;;N;;;2C6F;;2C6F
-0251;LATIN SMALL LETTER ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT A;;2C6D;;2C6D
-0252;LATIN SMALL LETTER TURNED ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED SCRIPT A;;2C70;;2C70
-0253;LATIN SMALL LETTER B WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER B HOOK;;0181;;0181
-0254;LATIN SMALL LETTER OPEN O;Ll;0;L;;;;;N;;;0186;;0186
-0255;LATIN SMALL LETTER C WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER C CURL;;;;
-0256;LATIN SMALL LETTER D WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER D RETROFLEX HOOK;;0189;;0189
-0257;LATIN SMALL LETTER D WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER D HOOK;;018A;;018A
-0258;LATIN SMALL LETTER REVERSED E;Ll;0;L;;;;;N;;;;;
-0259;LATIN SMALL LETTER SCHWA;Ll;0;L;;;;;N;;;018F;;018F
-025A;LATIN SMALL LETTER SCHWA WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCHWA HOOK;;;;
-025B;LATIN SMALL LETTER OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER EPSILON;;0190;;0190
-025C;LATIN SMALL LETTER REVERSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED EPSILON;;A7AB;;A7AB
-025D;LATIN SMALL LETTER REVERSED OPEN E WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED EPSILON HOOK;;;;
-025E;LATIN SMALL LETTER CLOSED REVERSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER CLOSED REVERSED EPSILON;;;;
-025F;LATIN SMALL LETTER DOTLESS J WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER DOTLESS J BAR;;;;
-0260;LATIN SMALL LETTER G WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER G HOOK;;0193;;0193
-0261;LATIN SMALL LETTER SCRIPT G;Ll;0;L;;;;;N;;;A7AC;;A7AC
-0262;LATIN LETTER SMALL CAPITAL G;Ll;0;L;;;;;N;;;;;
-0263;LATIN SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;0194;;0194
-0264;LATIN SMALL LETTER RAMS HORN;Ll;0;L;;;;;N;LATIN SMALL LETTER BABY GAMMA;;;;
-0265;LATIN SMALL LETTER TURNED H;Ll;0;L;;;;;N;;;A78D;;A78D
-0266;LATIN SMALL LETTER H WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER H HOOK;;A7AA;;A7AA
-0267;LATIN SMALL LETTER HENG WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER HENG HOOK;;;;
-0268;LATIN SMALL LETTER I WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED I;;0197;;0197
-0269;LATIN SMALL LETTER IOTA;Ll;0;L;;;;;N;;;0196;;0196
-026A;LATIN LETTER SMALL CAPITAL I;Ll;0;L;;;;;N;;;;;
-026B;LATIN SMALL LETTER L WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;2C62;;2C62
-026C;LATIN SMALL LETTER L WITH BELT;Ll;0;L;;;;;N;LATIN SMALL LETTER L BELT;;A7AD;;A7AD
-026D;LATIN SMALL LETTER L WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER L RETROFLEX HOOK;;;;
-026E;LATIN SMALL LETTER LEZH;Ll;0;L;;;;;N;LATIN SMALL LETTER L YOGH;;;;
-026F;LATIN SMALL LETTER TURNED M;Ll;0;L;;;;;N;;;019C;;019C
-0270;LATIN SMALL LETTER TURNED M WITH LONG LEG;Ll;0;L;;;;;N;;;;;
-0271;LATIN SMALL LETTER M WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER M HOOK;;2C6E;;2C6E
-0272;LATIN SMALL LETTER N WITH LEFT HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N HOOK;;019D;;019D
-0273;LATIN SMALL LETTER N WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N RETROFLEX HOOK;;;;
-0274;LATIN LETTER SMALL CAPITAL N;Ll;0;L;;;;;N;;;;;
-0275;LATIN SMALL LETTER BARRED O;Ll;0;L;;;;;N;;;019F;;019F
-0276;LATIN LETTER SMALL CAPITAL OE;Ll;0;L;;;;;N;LATIN LETTER SMALL CAPITAL O E;;;;
-0277;LATIN SMALL LETTER CLOSED OMEGA;Ll;0;L;;;;;N;;;;;
-0278;LATIN SMALL LETTER PHI;Ll;0;L;;;;;N;;;;;
-0279;LATIN SMALL LETTER TURNED R;Ll;0;L;;;;;N;;;;;
-027A;LATIN SMALL LETTER TURNED R WITH LONG LEG;Ll;0;L;;;;;N;;;;;
-027B;LATIN SMALL LETTER TURNED R WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED R HOOK;;;;
-027C;LATIN SMALL LETTER R WITH LONG LEG;Ll;0;L;;;;;N;;;;;
-027D;LATIN SMALL LETTER R WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER R HOOK;;2C64;;2C64
-027E;LATIN SMALL LETTER R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER FISHHOOK R;;;;
-027F;LATIN SMALL LETTER REVERSED R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED FISHHOOK R;;;;
-0280;LATIN LETTER SMALL CAPITAL R;Ll;0;L;;;;;N;;;01A6;;01A6
-0281;LATIN LETTER SMALL CAPITAL INVERTED R;Ll;0;L;;;;;N;;;;;
-0282;LATIN SMALL LETTER S WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER S HOOK;;;;
-0283;LATIN SMALL LETTER ESH;Ll;0;L;;;;;N;;;01A9;;01A9
-0284;LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER DOTLESS J BAR HOOK;;;;
-0285;LATIN SMALL LETTER SQUAT REVERSED ESH;Ll;0;L;;;;;N;;;;;
-0286;LATIN SMALL LETTER ESH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER ESH CURL;;;;
-0287;LATIN SMALL LETTER TURNED T;Ll;0;L;;;;;N;;;A7B1;;A7B1
-0288;LATIN SMALL LETTER T WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T RETROFLEX HOOK;;01AE;;01AE
-0289;LATIN SMALL LETTER U BAR;Ll;0;L;;;;;N;;;0244;;0244
-028A;LATIN SMALL LETTER UPSILON;Ll;0;L;;;;;N;;;01B1;;01B1
-028B;LATIN SMALL LETTER V WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT V;;01B2;;01B2
-028C;LATIN SMALL LETTER TURNED V;Ll;0;L;;;;;N;;;0245;;0245
-028D;LATIN SMALL LETTER TURNED W;Ll;0;L;;;;;N;;;;;
-028E;LATIN SMALL LETTER TURNED Y;Ll;0;L;;;;;N;;;;;
-028F;LATIN LETTER SMALL CAPITAL Y;Ll;0;L;;;;;N;;;;;
-0290;LATIN SMALL LETTER Z WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Z RETROFLEX HOOK;;;;
-0291;LATIN SMALL LETTER Z WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER Z CURL;;;;
-0292;LATIN SMALL LETTER EZH;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH;;01B7;;01B7
-0293;LATIN SMALL LETTER EZH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH CURL;;;;
-0294;LATIN LETTER GLOTTAL STOP;Lo;0;L;;;;;N;;;;;
-0295;LATIN LETTER PHARYNGEAL VOICED FRICATIVE;Ll;0;L;;;;;N;LATIN LETTER REVERSED GLOTTAL STOP;;;;
-0296;LATIN LETTER INVERTED GLOTTAL STOP;Ll;0;L;;;;;N;;;;;
-0297;LATIN LETTER STRETCHED C;Ll;0;L;;;;;N;;;;;
-0298;LATIN LETTER BILABIAL CLICK;Ll;0;L;;;;;N;LATIN LETTER BULLSEYE;;;;
-0299;LATIN LETTER SMALL CAPITAL B;Ll;0;L;;;;;N;;;;;
-029A;LATIN SMALL LETTER CLOSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER CLOSED EPSILON;;;;
-029B;LATIN LETTER SMALL CAPITAL G WITH HOOK;Ll;0;L;;;;;N;LATIN LETTER SMALL CAPITAL G HOOK;;;;
-029C;LATIN LETTER SMALL CAPITAL H;Ll;0;L;;;;;N;;;;;
-029D;LATIN SMALL LETTER J WITH CROSSED-TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER CROSSED-TAIL J;;A7B2;;A7B2
-029E;LATIN SMALL LETTER TURNED K;Ll;0;L;;;;;N;;;A7B0;;A7B0
-029F;LATIN LETTER SMALL CAPITAL L;Ll;0;L;;;;;N;;;;;
-02A0;LATIN SMALL LETTER Q WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Q HOOK;;;;
-02A1;LATIN LETTER GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER GLOTTAL STOP BAR;;;;
-02A2;LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER REVERSED GLOTTAL STOP BAR;;;;
-02A3;LATIN SMALL LETTER DZ DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER D Z;;;;
-02A4;LATIN SMALL LETTER DEZH DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER D YOGH;;;;
-02A5;LATIN SMALL LETTER DZ DIGRAPH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER D Z CURL;;;;
-02A6;LATIN SMALL LETTER TS DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER T S;;;;
-02A7;LATIN SMALL LETTER TESH DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER T ESH;;;;
-02A8;LATIN SMALL LETTER TC DIGRAPH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER T C CURL;;;;
-02A9;LATIN SMALL LETTER FENG DIGRAPH;Ll;0;L;;;;;N;;;;;
-02AA;LATIN SMALL LETTER LS DIGRAPH;Ll;0;L;;;;;N;;;;;
-02AB;LATIN SMALL LETTER LZ DIGRAPH;Ll;0;L;;;;;N;;;;;
-02AC;LATIN LETTER BILABIAL PERCUSSIVE;Ll;0;L;;;;;N;;;;;
-02AD;LATIN LETTER BIDENTAL PERCUSSIVE;Ll;0;L;;;;;N;;;;;
-02AE;LATIN SMALL LETTER TURNED H WITH FISHHOOK;Ll;0;L;;;;;N;;;;;
-02AF;LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL;Ll;0;L;;;;;N;;;;;
-02B0;MODIFIER LETTER SMALL H;Lm;0;L; 0068;;;;N;;;;;
-02B1;MODIFIER LETTER SMALL H WITH HOOK;Lm;0;L; 0266;;;;N;MODIFIER LETTER SMALL H HOOK;;;;
-02B2;MODIFIER LETTER SMALL J;Lm;0;L; 006A;;;;N;;;;;
-02B3;MODIFIER LETTER SMALL R;Lm;0;L; 0072;;;;N;;;;;
-02B4;MODIFIER LETTER SMALL TURNED R;Lm;0;L; 0279;;;;N;;;;;
-02B5;MODIFIER LETTER SMALL TURNED R WITH HOOK;Lm;0;L; 027B;;;;N;MODIFIER LETTER SMALL TURNED R HOOK;;;;
-02B6;MODIFIER LETTER SMALL CAPITAL INVERTED R;Lm;0;L; 0281;;;;N;;;;;
-02B7;MODIFIER LETTER SMALL W;Lm;0;L; 0077;;;;N;;;;;
-02B8;MODIFIER LETTER SMALL Y;Lm;0;L; 0079;;;;N;;;;;
-02B9;MODIFIER LETTER PRIME;Lm;0;ON;;;;;N;;;;;
-02BA;MODIFIER LETTER DOUBLE PRIME;Lm;0;ON;;;;;N;;;;;
-02BB;MODIFIER LETTER TURNED COMMA;Lm;0;L;;;;;N;;;;;
-02BC;MODIFIER LETTER APOSTROPHE;Lm;0;L;;;;;N;;;;;
-02BD;MODIFIER LETTER REVERSED COMMA;Lm;0;L;;;;;N;;;;;
-02BE;MODIFIER LETTER RIGHT HALF RING;Lm;0;L;;;;;N;;;;;
-02BF;MODIFIER LETTER LEFT HALF RING;Lm;0;L;;;;;N;;;;;
-02C0;MODIFIER LETTER GLOTTAL STOP;Lm;0;L;;;;;N;;;;;
-02C1;MODIFIER LETTER REVERSED GLOTTAL STOP;Lm;0;L;;;;;N;;;;;
-02C2;MODIFIER LETTER LEFT ARROWHEAD;Sk;0;ON;;;;;N;;;;;
-02C3;MODIFIER LETTER RIGHT ARROWHEAD;Sk;0;ON;;;;;N;;;;;
-02C4;MODIFIER LETTER UP ARROWHEAD;Sk;0;ON;;;;;N;;;;;
-02C5;MODIFIER LETTER DOWN ARROWHEAD;Sk;0;ON;;;;;N;;;;;
-02C6;MODIFIER LETTER CIRCUMFLEX ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER CIRCUMFLEX;;;;
-02C7;CARON;Lm;0;ON;;;;;N;MODIFIER LETTER HACEK;;;;
-02C8;MODIFIER LETTER VERTICAL LINE;Lm;0;ON;;;;;N;;;;;
-02C9;MODIFIER LETTER MACRON;Lm;0;ON;;;;;N;;;;;
-02CA;MODIFIER LETTER ACUTE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER ACUTE;;;;
-02CB;MODIFIER LETTER GRAVE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER GRAVE;;;;
-02CC;MODIFIER LETTER LOW VERTICAL LINE;Lm;0;ON;;;;;N;;;;;
-02CD;MODIFIER LETTER LOW MACRON;Lm;0;ON;;;;;N;;;;;
-02CE;MODIFIER LETTER LOW GRAVE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER LOW GRAVE;;;;
-02CF;MODIFIER LETTER LOW ACUTE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER LOW ACUTE;;;;
-02D0;MODIFIER LETTER TRIANGULAR COLON;Lm;0;L;;;;;N;;;;;
-02D1;MODIFIER LETTER HALF TRIANGULAR COLON;Lm;0;L;;;;;N;;;;;
-02D2;MODIFIER LETTER CENTRED RIGHT HALF RING;Sk;0;ON;;;;;N;MODIFIER LETTER CENTERED RIGHT HALF RING;;;;
-02D3;MODIFIER LETTER CENTRED LEFT HALF RING;Sk;0;ON;;;;;N;MODIFIER LETTER CENTERED LEFT HALF RING;;;;
-02D4;MODIFIER LETTER UP TACK;Sk;0;ON;;;;;N;;;;;
-02D5;MODIFIER LETTER DOWN TACK;Sk;0;ON;;;;;N;;;;;
-02D6;MODIFIER LETTER PLUS SIGN;Sk;0;ON;;;;;N;;;;;
-02D7;MODIFIER LETTER MINUS SIGN;Sk;0;ON;;;;;N;;;;;
-02D8;BREVE;Sk;0;ON; 0020 0306;;;;N;SPACING BREVE;;;;
-02D9;DOT ABOVE;Sk;0;ON; 0020 0307;;;;N;SPACING DOT ABOVE;;;;
-02DA;RING ABOVE;Sk;0;ON; 0020 030A;;;;N;SPACING RING ABOVE;;;;
-02DB;OGONEK;Sk;0;ON; 0020 0328;;;;N;SPACING OGONEK;;;;
-02DC;SMALL TILDE;Sk;0;ON; 0020 0303;;;;N;SPACING TILDE;;;;
-02DD;DOUBLE ACUTE ACCENT;Sk;0;ON; 0020 030B;;;;N;SPACING DOUBLE ACUTE;;;;
-02DE;MODIFIER LETTER RHOTIC HOOK;Sk;0;ON;;;;;N;;;;;
-02DF;MODIFIER LETTER CROSS ACCENT;Sk;0;ON;;;;;N;;;;;
-02E0;MODIFIER LETTER SMALL GAMMA;Lm;0;L; 0263;;;;N;;;;;
-02E1;MODIFIER LETTER SMALL L;Lm;0;L; 006C;;;;N;;;;;
-02E2;MODIFIER LETTER SMALL S;Lm;0;L; 0073;;;;N;;;;;
-02E3;MODIFIER LETTER SMALL X;Lm;0;L; 0078;;;;N;;;;;
-02E4;MODIFIER LETTER SMALL REVERSED GLOTTAL STOP;Lm;0;L; 0295;;;;N;;;;;
-02E5;MODIFIER LETTER EXTRA-HIGH TONE BAR;Sk;0;ON;;;;;N;;;;;
-02E6;MODIFIER LETTER HIGH TONE BAR;Sk;0;ON;;;;;N;;;;;
-02E7;MODIFIER LETTER MID TONE BAR;Sk;0;ON;;;;;N;;;;;
-02E8;MODIFIER LETTER LOW TONE BAR;Sk;0;ON;;;;;N;;;;;
-02E9;MODIFIER LETTER EXTRA-LOW TONE BAR;Sk;0;ON;;;;;N;;;;;
-02EA;MODIFIER LETTER YIN DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;;
-02EB;MODIFIER LETTER YANG DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;;
-02EC;MODIFIER LETTER VOICING;Lm;0;ON;;;;;N;;;;;
-02ED;MODIFIER LETTER UNASPIRATED;Sk;0;ON;;;;;N;;;;;
-02EE;MODIFIER LETTER DOUBLE APOSTROPHE;Lm;0;L;;;;;N;;;;;
-02EF;MODIFIER LETTER LOW DOWN ARROWHEAD;Sk;0;ON;;;;;N;;;;;
-02F0;MODIFIER LETTER LOW UP ARROWHEAD;Sk;0;ON;;;;;N;;;;;
-02F1;MODIFIER LETTER LOW LEFT ARROWHEAD;Sk;0;ON;;;;;N;;;;;
-02F2;MODIFIER LETTER LOW RIGHT ARROWHEAD;Sk;0;ON;;;;;N;;;;;
-02F3;MODIFIER LETTER LOW RING;Sk;0;ON;;;;;N;;;;;
-02F4;MODIFIER LETTER MIDDLE GRAVE ACCENT;Sk;0;ON;;;;;N;;;;;
-02F5;MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT;Sk;0;ON;;;;;N;;;;;
-02F6;MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT;Sk;0;ON;;;;;N;;;;;
-02F7;MODIFIER LETTER LOW TILDE;Sk;0;ON;;;;;N;;;;;
-02F8;MODIFIER LETTER RAISED COLON;Sk;0;ON;;;;;N;;;;;
-02F9;MODIFIER LETTER BEGIN HIGH TONE;Sk;0;ON;;;;;N;;;;;
-02FA;MODIFIER LETTER END HIGH TONE;Sk;0;ON;;;;;N;;;;;
-02FB;MODIFIER LETTER BEGIN LOW TONE;Sk;0;ON;;;;;N;;;;;
-02FC;MODIFIER LETTER END LOW TONE;Sk;0;ON;;;;;N;;;;;
-02FD;MODIFIER LETTER SHELF;Sk;0;ON;;;;;N;;;;;
-02FE;MODIFIER LETTER OPEN SHELF;Sk;0;ON;;;;;N;;;;;
-02FF;MODIFIER LETTER LOW LEFT ARROW;Sk;0;ON;;;;;N;;;;;
-0300;COMBINING GRAVE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING GRAVE;;;;
-0301;COMBINING ACUTE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING ACUTE;;;;
-0302;COMBINING CIRCUMFLEX ACCENT;Mn;230;NSM;;;;;N;NON-SPACING CIRCUMFLEX;;;;
-0303;COMBINING TILDE;Mn;230;NSM;;;;;N;NON-SPACING TILDE;;;;
-0304;COMBINING MACRON;Mn;230;NSM;;;;;N;NON-SPACING MACRON;;;;
-0305;COMBINING OVERLINE;Mn;230;NSM;;;;;N;NON-SPACING OVERSCORE;;;;
-0306;COMBINING BREVE;Mn;230;NSM;;;;;N;NON-SPACING BREVE;;;;
-0307;COMBINING DOT ABOVE;Mn;230;NSM;;;;;N;NON-SPACING DOT ABOVE;;;;
-0308;COMBINING DIAERESIS;Mn;230;NSM;;;;;N;NON-SPACING DIAERESIS;;;;
-0309;COMBINING HOOK ABOVE;Mn;230;NSM;;;;;N;NON-SPACING HOOK ABOVE;;;;
-030A;COMBINING RING ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RING ABOVE;;;;
-030B;COMBINING DOUBLE ACUTE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE ACUTE;;;;
-030C;COMBINING CARON;Mn;230;NSM;;;;;N;NON-SPACING HACEK;;;;
-030D;COMBINING VERTICAL LINE ABOVE;Mn;230;NSM;;;;;N;NON-SPACING VERTICAL LINE ABOVE;;;;
-030E;COMBINING DOUBLE VERTICAL LINE ABOVE;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE VERTICAL LINE ABOVE;;;;
-030F;COMBINING DOUBLE GRAVE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE GRAVE;;;;
-0310;COMBINING CANDRABINDU;Mn;230;NSM;;;;;N;NON-SPACING CANDRABINDU;;;;
-0311;COMBINING INVERTED BREVE;Mn;230;NSM;;;;;N;NON-SPACING INVERTED BREVE;;;;
-0312;COMBINING TURNED COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING TURNED COMMA ABOVE;;;;
-0313;COMBINING COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING COMMA ABOVE;;;;
-0314;COMBINING REVERSED COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING REVERSED COMMA ABOVE;;;;
-0315;COMBINING COMMA ABOVE RIGHT;Mn;232;NSM;;;;;N;NON-SPACING COMMA ABOVE RIGHT;;;;
-0316;COMBINING GRAVE ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING GRAVE BELOW;;;;
-0317;COMBINING ACUTE ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING ACUTE BELOW;;;;
-0318;COMBINING LEFT TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING LEFT TACK BELOW;;;;
-0319;COMBINING RIGHT TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING RIGHT TACK BELOW;;;;
-031A;COMBINING LEFT ANGLE ABOVE;Mn;232;NSM;;;;;N;NON-SPACING LEFT ANGLE ABOVE;;;;
-031B;COMBINING HORN;Mn;216;NSM;;;;;N;NON-SPACING HORN;;;;
-031C;COMBINING LEFT HALF RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING LEFT HALF RING BELOW;;;;
-031D;COMBINING UP TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING UP TACK BELOW;;;;
-031E;COMBINING DOWN TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOWN TACK BELOW;;;;
-031F;COMBINING PLUS SIGN BELOW;Mn;220;NSM;;;;;N;NON-SPACING PLUS SIGN BELOW;;;;
-0320;COMBINING MINUS SIGN BELOW;Mn;220;NSM;;;;;N;NON-SPACING MINUS SIGN BELOW;;;;
-0321;COMBINING PALATALIZED HOOK BELOW;Mn;202;NSM;;;;;N;NON-SPACING PALATALIZED HOOK BELOW;;;;
-0322;COMBINING RETROFLEX HOOK BELOW;Mn;202;NSM;;;;;N;NON-SPACING RETROFLEX HOOK BELOW;;;;
-0323;COMBINING DOT BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOT BELOW;;;;
-0324;COMBINING DIAERESIS BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOUBLE DOT BELOW;;;;
-0325;COMBINING RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING RING BELOW;;;;
-0326;COMBINING COMMA BELOW;Mn;220;NSM;;;;;N;NON-SPACING COMMA BELOW;;;;
-0327;COMBINING CEDILLA;Mn;202;NSM;;;;;N;NON-SPACING CEDILLA;;;;
-0328;COMBINING OGONEK;Mn;202;NSM;;;;;N;NON-SPACING OGONEK;;;;
-0329;COMBINING VERTICAL LINE BELOW;Mn;220;NSM;;;;;N;NON-SPACING VERTICAL LINE BELOW;;;;
-032A;COMBINING BRIDGE BELOW;Mn;220;NSM;;;;;N;NON-SPACING BRIDGE BELOW;;;;
-032B;COMBINING INVERTED DOUBLE ARCH BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED DOUBLE ARCH BELOW;;;;
-032C;COMBINING CARON BELOW;Mn;220;NSM;;;;;N;NON-SPACING HACEK BELOW;;;;
-032D;COMBINING CIRCUMFLEX ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING CIRCUMFLEX BELOW;;;;
-032E;COMBINING BREVE BELOW;Mn;220;NSM;;;;;N;NON-SPACING BREVE BELOW;;;;
-032F;COMBINING INVERTED BREVE BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED BREVE BELOW;;;;
-0330;COMBINING TILDE BELOW;Mn;220;NSM;;;;;N;NON-SPACING TILDE BELOW;;;;
-0331;COMBINING MACRON BELOW;Mn;220;NSM;;;;;N;NON-SPACING MACRON BELOW;;;;
-0332;COMBINING LOW LINE;Mn;220;NSM;;;;;N;NON-SPACING UNDERSCORE;;;;
-0333;COMBINING DOUBLE LOW LINE;Mn;220;NSM;;;;;N;NON-SPACING DOUBLE UNDERSCORE;;;;
-0334;COMBINING TILDE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING TILDE OVERLAY;;;;
-0335;COMBINING SHORT STROKE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT BAR OVERLAY;;;;
-0336;COMBINING LONG STROKE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG BAR OVERLAY;;;;
-0337;COMBINING SHORT SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT SLASH OVERLAY;;;;
-0338;COMBINING LONG SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG SLASH OVERLAY;;;;
-0339;COMBINING RIGHT HALF RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING RIGHT HALF RING BELOW;;;;
-033A;COMBINING INVERTED BRIDGE BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED BRIDGE BELOW;;;;
-033B;COMBINING SQUARE BELOW;Mn;220;NSM;;;;;N;NON-SPACING SQUARE BELOW;;;;
-033C;COMBINING SEAGULL BELOW;Mn;220;NSM;;;;;N;NON-SPACING SEAGULL BELOW;;;;
-033D;COMBINING X ABOVE;Mn;230;NSM;;;;;N;NON-SPACING X ABOVE;;;;
-033E;COMBINING VERTICAL TILDE;Mn;230;NSM;;;;;N;NON-SPACING VERTICAL TILDE;;;;
-033F;COMBINING DOUBLE OVERLINE;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE OVERSCORE;;;;
-0340;COMBINING GRAVE TONE MARK;Mn;230;NSM;0300;;;;N;NON-SPACING GRAVE TONE MARK;;;;
-0341;COMBINING ACUTE TONE MARK;Mn;230;NSM;0301;;;;N;NON-SPACING ACUTE TONE MARK;;;;
-0342;COMBINING GREEK PERISPOMENI;Mn;230;NSM;;;;;N;;;;;
-0343;COMBINING GREEK KORONIS;Mn;230;NSM;0313;;;;N;;;;;
-0344;COMBINING GREEK DIALYTIKA TONOS;Mn;230;NSM;0308 0301;;;;N;GREEK NON-SPACING DIAERESIS TONOS;;;;
-0345;COMBINING GREEK YPOGEGRAMMENI;Mn;240;NSM;;;;;N;GREEK NON-SPACING IOTA BELOW;;0399;;0399
-0346;COMBINING BRIDGE ABOVE;Mn;230;NSM;;;;;N;;;;;
-0347;COMBINING EQUALS SIGN BELOW;Mn;220;NSM;;;;;N;;;;;
-0348;COMBINING DOUBLE VERTICAL LINE BELOW;Mn;220;NSM;;;;;N;;;;;
-0349;COMBINING LEFT ANGLE BELOW;Mn;220;NSM;;;;;N;;;;;
-034A;COMBINING NOT TILDE ABOVE;Mn;230;NSM;;;;;N;;;;;
-034B;COMBINING HOMOTHETIC ABOVE;Mn;230;NSM;;;;;N;;;;;
-034C;COMBINING ALMOST EQUAL TO ABOVE;Mn;230;NSM;;;;;N;;;;;
-034D;COMBINING LEFT RIGHT ARROW BELOW;Mn;220;NSM;;;;;N;;;;;
-034E;COMBINING UPWARDS ARROW BELOW;Mn;220;NSM;;;;;N;;;;;
-034F;COMBINING GRAPHEME JOINER;Mn;0;NSM;;;;;N;;;;;
-0350;COMBINING RIGHT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;;
-0351;COMBINING LEFT HALF RING ABOVE;Mn;230;NSM;;;;;N;;;;;
-0352;COMBINING FERMATA;Mn;230;NSM;;;;;N;;;;;
-0353;COMBINING X BELOW;Mn;220;NSM;;;;;N;;;;;
-0354;COMBINING LEFT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;;
-0355;COMBINING RIGHT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;;
-0356;COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;;
-0357;COMBINING RIGHT HALF RING ABOVE;Mn;230;NSM;;;;;N;;;;;
-0358;COMBINING DOT ABOVE RIGHT;Mn;232;NSM;;;;;N;;;;;
-0359;COMBINING ASTERISK BELOW;Mn;220;NSM;;;;;N;;;;;
-035A;COMBINING DOUBLE RING BELOW;Mn;220;NSM;;;;;N;;;;;
-035B;COMBINING ZIGZAG ABOVE;Mn;230;NSM;;;;;N;;;;;
-035C;COMBINING DOUBLE BREVE BELOW;Mn;233;NSM;;;;;N;;;;;
-035D;COMBINING DOUBLE BREVE;Mn;234;NSM;;;;;N;;;;;
-035E;COMBINING DOUBLE MACRON;Mn;234;NSM;;;;;N;;;;;
-035F;COMBINING DOUBLE MACRON BELOW;Mn;233;NSM;;;;;N;;;;;
-0360;COMBINING DOUBLE TILDE;Mn;234;NSM;;;;;N;;;;;
-0361;COMBINING DOUBLE INVERTED BREVE;Mn;234;NSM;;;;;N;;;;;
-0362;COMBINING DOUBLE RIGHTWARDS ARROW BELOW;Mn;233;NSM;;;;;N;;;;;
-0363;COMBINING LATIN SMALL LETTER A;Mn;230;NSM;;;;;N;;;;;
-0364;COMBINING LATIN SMALL LETTER E;Mn;230;NSM;;;;;N;;;;;
-0365;COMBINING LATIN SMALL LETTER I;Mn;230;NSM;;;;;N;;;;;
-0366;COMBINING LATIN SMALL LETTER O;Mn;230;NSM;;;;;N;;;;;
-0367;COMBINING LATIN SMALL LETTER U;Mn;230;NSM;;;;;N;;;;;
-0368;COMBINING LATIN SMALL LETTER C;Mn;230;NSM;;;;;N;;;;;
-0369;COMBINING LATIN SMALL LETTER D;Mn;230;NSM;;;;;N;;;;;
-036A;COMBINING LATIN SMALL LETTER H;Mn;230;NSM;;;;;N;;;;;
-036B;COMBINING LATIN SMALL LETTER M;Mn;230;NSM;;;;;N;;;;;
-036C;COMBINING LATIN SMALL LETTER R;Mn;230;NSM;;;;;N;;;;;
-036D;COMBINING LATIN SMALL LETTER T;Mn;230;NSM;;;;;N;;;;;
-036E;COMBINING LATIN SMALL LETTER V;Mn;230;NSM;;;;;N;;;;;
-036F;COMBINING LATIN SMALL LETTER X;Mn;230;NSM;;;;;N;;;;;
-0370;GREEK CAPITAL LETTER HETA;Lu;0;L;;;;;N;;;;0371;
-0371;GREEK SMALL LETTER HETA;Ll;0;L;;;;;N;;;0370;;0370
-0372;GREEK CAPITAL LETTER ARCHAIC SAMPI;Lu;0;L;;;;;N;;;;0373;
-0373;GREEK SMALL LETTER ARCHAIC SAMPI;Ll;0;L;;;;;N;;;0372;;0372
-0374;GREEK NUMERAL SIGN;Lm;0;ON;02B9;;;;N;GREEK UPPER NUMERAL SIGN;;;;
-0375;GREEK LOWER NUMERAL SIGN;Sk;0;ON;;;;;N;;;;;
-0376;GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA;Lu;0;L;;;;;N;;;;0377;
-0377;GREEK SMALL LETTER PAMPHYLIAN DIGAMMA;Ll;0;L;;;;;N;;;0376;;0376
-037A;GREEK YPOGEGRAMMENI;Lm;0;L; 0020 0345;;;;N;GREEK SPACING IOTA BELOW;;;;
-037B;GREEK SMALL REVERSED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FD;;03FD
-037C;GREEK SMALL DOTTED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FE;;03FE
-037D;GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FF;;03FF
-037E;GREEK QUESTION MARK;Po;0;ON;003B;;;;N;;;;;
-037F;GREEK CAPITAL LETTER YOT;Lu;0;L;;;;;N;;;;03F3;
-0384;GREEK TONOS;Sk;0;ON; 0020 0301;;;;N;GREEK SPACING TONOS;;;;
-0385;GREEK DIALYTIKA TONOS;Sk;0;ON;00A8 0301;;;;N;GREEK SPACING DIAERESIS TONOS;;;;
-0386;GREEK CAPITAL LETTER ALPHA WITH TONOS;Lu;0;L;0391 0301;;;;N;GREEK CAPITAL LETTER ALPHA TONOS;;;03AC;
-0387;GREEK ANO TELEIA;Po;0;ON;00B7;;;;N;;;;;
-0388;GREEK CAPITAL LETTER EPSILON WITH TONOS;Lu;0;L;0395 0301;;;;N;GREEK CAPITAL LETTER EPSILON TONOS;;;03AD;
-0389;GREEK CAPITAL LETTER ETA WITH TONOS;Lu;0;L;0397 0301;;;;N;GREEK CAPITAL LETTER ETA TONOS;;;03AE;
-038A;GREEK CAPITAL LETTER IOTA WITH TONOS;Lu;0;L;0399 0301;;;;N;GREEK CAPITAL LETTER IOTA TONOS;;;03AF;
-038C;GREEK CAPITAL LETTER OMICRON WITH TONOS;Lu;0;L;039F 0301;;;;N;GREEK CAPITAL LETTER OMICRON TONOS;;;03CC;
-038E;GREEK CAPITAL LETTER UPSILON WITH TONOS;Lu;0;L;03A5 0301;;;;N;GREEK CAPITAL LETTER UPSILON TONOS;;;03CD;
-038F;GREEK CAPITAL LETTER OMEGA WITH TONOS;Lu;0;L;03A9 0301;;;;N;GREEK CAPITAL LETTER OMEGA TONOS;;;03CE;
-0390;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS;Ll;0;L;03CA 0301;;;;N;GREEK SMALL LETTER IOTA DIAERESIS TONOS;;;;
-0391;GREEK CAPITAL LETTER ALPHA;Lu;0;L;;;;;N;;;;03B1;
-0392;GREEK CAPITAL LETTER BETA;Lu;0;L;;;;;N;;;;03B2;
-0393;GREEK CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;03B3;
-0394;GREEK CAPITAL LETTER DELTA;Lu;0;L;;;;;N;;;;03B4;
-0395;GREEK CAPITAL LETTER EPSILON;Lu;0;L;;;;;N;;;;03B5;
-0396;GREEK CAPITAL LETTER ZETA;Lu;0;L;;;;;N;;;;03B6;
-0397;GREEK CAPITAL LETTER ETA;Lu;0;L;;;;;N;;;;03B7;
-0398;GREEK CAPITAL LETTER THETA;Lu;0;L;;;;;N;;;;03B8;
-0399;GREEK CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;03B9;
-039A;GREEK CAPITAL LETTER KAPPA;Lu;0;L;;;;;N;;;;03BA;
-039B;GREEK CAPITAL LETTER LAMDA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER LAMBDA;;;03BB;
-039C;GREEK CAPITAL LETTER MU;Lu;0;L;;;;;N;;;;03BC;
-039D;GREEK CAPITAL LETTER NU;Lu;0;L;;;;;N;;;;03BD;
-039E;GREEK CAPITAL LETTER XI;Lu;0;L;;;;;N;;;;03BE;
-039F;GREEK CAPITAL LETTER OMICRON;Lu;0;L;;;;;N;;;;03BF;
-03A0;GREEK CAPITAL LETTER PI;Lu;0;L;;;;;N;;;;03C0;
-03A1;GREEK CAPITAL LETTER RHO;Lu;0;L;;;;;N;;;;03C1;
-03A3;GREEK CAPITAL LETTER SIGMA;Lu;0;L;;;;;N;;;;03C3;
-03A4;GREEK CAPITAL LETTER TAU;Lu;0;L;;;;;N;;;;03C4;
-03A5;GREEK CAPITAL LETTER UPSILON;Lu;0;L;;;;;N;;;;03C5;
-03A6;GREEK CAPITAL LETTER PHI;Lu;0;L;;;;;N;;;;03C6;
-03A7;GREEK CAPITAL LETTER CHI;Lu;0;L;;;;;N;;;;03C7;
-03A8;GREEK CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;03C8;
-03A9;GREEK CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;03C9;
-03AA;GREEK CAPITAL LETTER IOTA WITH DIALYTIKA;Lu;0;L;0399 0308;;;;N;GREEK CAPITAL LETTER IOTA DIAERESIS;;;03CA;
-03AB;GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA;Lu;0;L;03A5 0308;;;;N;GREEK CAPITAL LETTER UPSILON DIAERESIS;;;03CB;
-03AC;GREEK SMALL LETTER ALPHA WITH TONOS;Ll;0;L;03B1 0301;;;;N;GREEK SMALL LETTER ALPHA TONOS;;0386;;0386
-03AD;GREEK SMALL LETTER EPSILON WITH TONOS;Ll;0;L;03B5 0301;;;;N;GREEK SMALL LETTER EPSILON TONOS;;0388;;0388
-03AE;GREEK SMALL LETTER ETA WITH TONOS;Ll;0;L;03B7 0301;;;;N;GREEK SMALL LETTER ETA TONOS;;0389;;0389
-03AF;GREEK SMALL LETTER IOTA WITH TONOS;Ll;0;L;03B9 0301;;;;N;GREEK SMALL LETTER IOTA TONOS;;038A;;038A
-03B0;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS;Ll;0;L;03CB 0301;;;;N;GREEK SMALL LETTER UPSILON DIAERESIS TONOS;;;;
-03B1;GREEK SMALL LETTER ALPHA;Ll;0;L;;;;;N;;;0391;;0391
-03B2;GREEK SMALL LETTER BETA;Ll;0;L;;;;;N;;;0392;;0392
-03B3;GREEK SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;0393;;0393
-03B4;GREEK SMALL LETTER DELTA;Ll;0;L;;;;;N;;;0394;;0394
-03B5;GREEK SMALL LETTER EPSILON;Ll;0;L;;;;;N;;;0395;;0395
-03B6;GREEK SMALL LETTER ZETA;Ll;0;L;;;;;N;;;0396;;0396
-03B7;GREEK SMALL LETTER ETA;Ll;0;L;;;;;N;;;0397;;0397
-03B8;GREEK SMALL LETTER THETA;Ll;0;L;;;;;N;;;0398;;0398
-03B9;GREEK SMALL LETTER IOTA;Ll;0;L;;;;;N;;;0399;;0399
-03BA;GREEK SMALL LETTER KAPPA;Ll;0;L;;;;;N;;;039A;;039A
-03BB;GREEK SMALL LETTER LAMDA;Ll;0;L;;;;;N;GREEK SMALL LETTER LAMBDA;;039B;;039B
-03BC;GREEK SMALL LETTER MU;Ll;0;L;;;;;N;;;039C;;039C
-03BD;GREEK SMALL LETTER NU;Ll;0;L;;;;;N;;;039D;;039D
-03BE;GREEK SMALL LETTER XI;Ll;0;L;;;;;N;;;039E;;039E
-03BF;GREEK SMALL LETTER OMICRON;Ll;0;L;;;;;N;;;039F;;039F
-03C0;GREEK SMALL LETTER PI;Ll;0;L;;;;;N;;;03A0;;03A0
-03C1;GREEK SMALL LETTER RHO;Ll;0;L;;;;;N;;;03A1;;03A1
-03C2;GREEK SMALL LETTER FINAL SIGMA;Ll;0;L;;;;;N;;;03A3;;03A3
-03C3;GREEK SMALL LETTER SIGMA;Ll;0;L;;;;;N;;;03A3;;03A3
-03C4;GREEK SMALL LETTER TAU;Ll;0;L;;;;;N;;;03A4;;03A4
-03C5;GREEK SMALL LETTER UPSILON;Ll;0;L;;;;;N;;;03A5;;03A5
-03C6;GREEK SMALL LETTER PHI;Ll;0;L;;;;;N;;;03A6;;03A6
-03C7;GREEK SMALL LETTER CHI;Ll;0;L;;;;;N;;;03A7;;03A7
-03C8;GREEK SMALL LETTER PSI;Ll;0;L;;;;;N;;;03A8;;03A8
-03C9;GREEK SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;03A9;;03A9
-03CA;GREEK SMALL LETTER IOTA WITH DIALYTIKA;Ll;0;L;03B9 0308;;;;N;GREEK SMALL LETTER IOTA DIAERESIS;;03AA;;03AA
-03CB;GREEK SMALL LETTER UPSILON WITH DIALYTIKA;Ll;0;L;03C5 0308;;;;N;GREEK SMALL LETTER UPSILON DIAERESIS;;03AB;;03AB
-03CC;GREEK SMALL LETTER OMICRON WITH TONOS;Ll;0;L;03BF 0301;;;;N;GREEK SMALL LETTER OMICRON TONOS;;038C;;038C
-03CD;GREEK SMALL LETTER UPSILON WITH TONOS;Ll;0;L;03C5 0301;;;;N;GREEK SMALL LETTER UPSILON TONOS;;038E;;038E
-03CE;GREEK SMALL LETTER OMEGA WITH TONOS;Ll;0;L;03C9 0301;;;;N;GREEK SMALL LETTER OMEGA TONOS;;038F;;038F
-03CF;GREEK CAPITAL KAI SYMBOL;Lu;0;L;;;;;N;;;;03D7;
-03D0;GREEK BETA SYMBOL;Ll;0;L; 03B2;;;;N;GREEK SMALL LETTER CURLED BETA;;0392;;0392
-03D1;GREEK THETA SYMBOL;Ll;0;L; 03B8;;;;N;GREEK SMALL LETTER SCRIPT THETA;;0398;;0398
-03D2;GREEK UPSILON WITH HOOK SYMBOL;Lu;0;L; 03A5;;;;N;GREEK CAPITAL LETTER UPSILON HOOK;;;;
-03D3;GREEK UPSILON WITH ACUTE AND HOOK SYMBOL;Lu;0;L;03D2 0301;;;;N;GREEK CAPITAL LETTER UPSILON HOOK TONOS;;;;
-03D4;GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL;Lu;0;L;03D2 0308;;;;N;GREEK CAPITAL LETTER UPSILON HOOK DIAERESIS;;;;
-03D5;GREEK PHI SYMBOL;Ll;0;L; 03C6;;;;N;GREEK SMALL LETTER SCRIPT PHI;;03A6;;03A6
-03D6;GREEK PI SYMBOL;Ll;0;L; 03C0;;;;N;GREEK SMALL LETTER OMEGA PI;;03A0;;03A0
-03D7;GREEK KAI SYMBOL;Ll;0;L;;;;;N;;;03CF;;03CF
-03D8;GREEK LETTER ARCHAIC KOPPA;Lu;0;L;;;;;N;;;;03D9;
-03D9;GREEK SMALL LETTER ARCHAIC KOPPA;Ll;0;L;;;;;N;;;03D8;;03D8
-03DA;GREEK LETTER STIGMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER STIGMA;;;03DB;
-03DB;GREEK SMALL LETTER STIGMA;Ll;0;L;;;;;N;;;03DA;;03DA
-03DC;GREEK LETTER DIGAMMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER DIGAMMA;;;03DD;
-03DD;GREEK SMALL LETTER DIGAMMA;Ll;0;L;;;;;N;;;03DC;;03DC
-03DE;GREEK LETTER KOPPA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER KOPPA;;;03DF;
-03DF;GREEK SMALL LETTER KOPPA;Ll;0;L;;;;;N;;;03DE;;03DE
-03E0;GREEK LETTER SAMPI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SAMPI;;;03E1;
-03E1;GREEK SMALL LETTER SAMPI;Ll;0;L;;;;;N;;;03E0;;03E0
-03E2;COPTIC CAPITAL LETTER SHEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SHEI;;;03E3;
-03E3;COPTIC SMALL LETTER SHEI;Ll;0;L;;;;;N;GREEK SMALL LETTER SHEI;;03E2;;03E2
-03E4;COPTIC CAPITAL LETTER FEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER FEI;;;03E5;
-03E5;COPTIC SMALL LETTER FEI;Ll;0;L;;;;;N;GREEK SMALL LETTER FEI;;03E4;;03E4
-03E6;COPTIC CAPITAL LETTER KHEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER KHEI;;;03E7;
-03E7;COPTIC SMALL LETTER KHEI;Ll;0;L;;;;;N;GREEK SMALL LETTER KHEI;;03E6;;03E6
-03E8;COPTIC CAPITAL LETTER HORI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER HORI;;;03E9;
-03E9;COPTIC SMALL LETTER HORI;Ll;0;L;;;;;N;GREEK SMALL LETTER HORI;;03E8;;03E8
-03EA;COPTIC CAPITAL LETTER GANGIA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER GANGIA;;;03EB;
-03EB;COPTIC SMALL LETTER GANGIA;Ll;0;L;;;;;N;GREEK SMALL LETTER GANGIA;;03EA;;03EA
-03EC;COPTIC CAPITAL LETTER SHIMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SHIMA;;;03ED;
-03ED;COPTIC SMALL LETTER SHIMA;Ll;0;L;;;;;N;GREEK SMALL LETTER SHIMA;;03EC;;03EC
-03EE;COPTIC CAPITAL LETTER DEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER DEI;;;03EF;
-03EF;COPTIC SMALL LETTER DEI;Ll;0;L;;;;;N;GREEK SMALL LETTER DEI;;03EE;;03EE
-03F0;GREEK KAPPA SYMBOL;Ll;0;L; 03BA;;;;N;GREEK SMALL LETTER SCRIPT KAPPA;;039A;;039A
-03F1;GREEK RHO SYMBOL;Ll;0;L; 03C1;;;;N;GREEK SMALL LETTER TAILED RHO;;03A1;;03A1
-03F2;GREEK LUNATE SIGMA SYMBOL;Ll;0;L; 03C2;;;;N;GREEK SMALL LETTER LUNATE SIGMA;;03F9;;03F9
-03F3;GREEK LETTER YOT;Ll;0;L;;;;;N;;;037F;;037F
-03F4;GREEK CAPITAL THETA SYMBOL;Lu;0;L; 0398;;;;N;;;;03B8;
-03F5;GREEK LUNATE EPSILON SYMBOL;Ll;0;L; 03B5;;;;N;;;0395;;0395
-03F6;GREEK REVERSED LUNATE EPSILON SYMBOL;Sm;0;ON;;;;;N;;;;;
-03F7;GREEK CAPITAL LETTER SHO;Lu;0;L;;;;;N;;;;03F8;
-03F8;GREEK SMALL LETTER SHO;Ll;0;L;;;;;N;;;03F7;;03F7
-03F9;GREEK CAPITAL LUNATE SIGMA SYMBOL;Lu;0;L; 03A3;;;;N;;;;03F2;
-03FA;GREEK CAPITAL LETTER SAN;Lu;0;L;;;;;N;;;;03FB;
-03FB;GREEK SMALL LETTER SAN;Ll;0;L;;;;;N;;;03FA;;03FA
-03FC;GREEK RHO WITH STROKE SYMBOL;Ll;0;L;;;;;N;;;;;
-03FD;GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037B;
-03FE;GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037C;
-03FF;GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037D;
-0400;CYRILLIC CAPITAL LETTER IE WITH GRAVE;Lu;0;L;0415 0300;;;;N;;;;0450;
-0401;CYRILLIC CAPITAL LETTER IO;Lu;0;L;0415 0308;;;;N;;;;0451;
-0402;CYRILLIC CAPITAL LETTER DJE;Lu;0;L;;;;;N;;;;0452;
-0403;CYRILLIC CAPITAL LETTER GJE;Lu;0;L;0413 0301;;;;N;;;;0453;
-0404;CYRILLIC CAPITAL LETTER UKRAINIAN IE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER E;;;0454;
-0405;CYRILLIC CAPITAL LETTER DZE;Lu;0;L;;;;;N;;;;0455;
-0406;CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER I;;;0456;
-0407;CYRILLIC CAPITAL LETTER YI;Lu;0;L;0406 0308;;;;N;;;;0457;
-0408;CYRILLIC CAPITAL LETTER JE;Lu;0;L;;;;;N;;;;0458;
-0409;CYRILLIC CAPITAL LETTER LJE;Lu;0;L;;;;;N;;;;0459;
-040A;CYRILLIC CAPITAL LETTER NJE;Lu;0;L;;;;;N;;;;045A;
-040B;CYRILLIC CAPITAL LETTER TSHE;Lu;0;L;;;;;N;;;;045B;
-040C;CYRILLIC CAPITAL LETTER KJE;Lu;0;L;041A 0301;;;;N;;;;045C;
-040D;CYRILLIC CAPITAL LETTER I WITH GRAVE;Lu;0;L;0418 0300;;;;N;;;;045D;
-040E;CYRILLIC CAPITAL LETTER SHORT U;Lu;0;L;0423 0306;;;;N;;;;045E;
-040F;CYRILLIC CAPITAL LETTER DZHE;Lu;0;L;;;;;N;;;;045F;
-0410;CYRILLIC CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0430;
-0411;CYRILLIC CAPITAL LETTER BE;Lu;0;L;;;;;N;;;;0431;
-0412;CYRILLIC CAPITAL LETTER VE;Lu;0;L;;;;;N;;;;0432;
-0413;CYRILLIC CAPITAL LETTER GHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE;;;0433;
-0414;CYRILLIC CAPITAL LETTER DE;Lu;0;L;;;;;N;;;;0434;
-0415;CYRILLIC CAPITAL LETTER IE;Lu;0;L;;;;;N;;;;0435;
-0416;CYRILLIC CAPITAL LETTER ZHE;Lu;0;L;;;;;N;;;;0436;
-0417;CYRILLIC CAPITAL LETTER ZE;Lu;0;L;;;;;N;;;;0437;
-0418;CYRILLIC CAPITAL LETTER I;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER II;;;0438;
-0419;CYRILLIC CAPITAL LETTER SHORT I;Lu;0;L;0418 0306;;;;N;CYRILLIC CAPITAL LETTER SHORT II;;;0439;
-041A;CYRILLIC CAPITAL LETTER KA;Lu;0;L;;;;;N;;;;043A;
-041B;CYRILLIC CAPITAL LETTER EL;Lu;0;L;;;;;N;;;;043B;
-041C;CYRILLIC CAPITAL LETTER EM;Lu;0;L;;;;;N;;;;043C;
-041D;CYRILLIC CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;043D;
-041E;CYRILLIC CAPITAL LETTER O;Lu;0;L;;;;;N;;;;043E;
-041F;CYRILLIC CAPITAL LETTER PE;Lu;0;L;;;;;N;;;;043F;
-0420;CYRILLIC CAPITAL LETTER ER;Lu;0;L;;;;;N;;;;0440;
-0421;CYRILLIC CAPITAL LETTER ES;Lu;0;L;;;;;N;;;;0441;
-0422;CYRILLIC CAPITAL LETTER TE;Lu;0;L;;;;;N;;;;0442;
-0423;CYRILLIC CAPITAL LETTER U;Lu;0;L;;;;;N;;;;0443;
-0424;CYRILLIC CAPITAL LETTER EF;Lu;0;L;;;;;N;;;;0444;
-0425;CYRILLIC CAPITAL LETTER HA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KHA;;;0445;
-0426;CYRILLIC CAPITAL LETTER TSE;Lu;0;L;;;;;N;;;;0446;
-0427;CYRILLIC CAPITAL LETTER CHE;Lu;0;L;;;;;N;;;;0447;
-0428;CYRILLIC CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;0448;
-0429;CYRILLIC CAPITAL LETTER SHCHA;Lu;0;L;;;;;N;;;;0449;
-042A;CYRILLIC CAPITAL LETTER HARD SIGN;Lu;0;L;;;;;N;;;;044A;
-042B;CYRILLIC CAPITAL LETTER YERU;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER YERI;;;044B;
-042C;CYRILLIC CAPITAL LETTER SOFT SIGN;Lu;0;L;;;;;N;;;;044C;
-042D;CYRILLIC CAPITAL LETTER E;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER REVERSED E;;;044D;
-042E;CYRILLIC CAPITAL LETTER YU;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IU;;;044E;
-042F;CYRILLIC CAPITAL LETTER YA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IA;;;044F;
-0430;CYRILLIC SMALL LETTER A;Ll;0;L;;;;;N;;;0410;;0410
-0431;CYRILLIC SMALL LETTER BE;Ll;0;L;;;;;N;;;0411;;0411
-0432;CYRILLIC SMALL LETTER VE;Ll;0;L;;;;;N;;;0412;;0412
-0433;CYRILLIC SMALL LETTER GHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE;;0413;;0413
-0434;CYRILLIC SMALL LETTER DE;Ll;0;L;;;;;N;;;0414;;0414
-0435;CYRILLIC SMALL LETTER IE;Ll;0;L;;;;;N;;;0415;;0415
-0436;CYRILLIC SMALL LETTER ZHE;Ll;0;L;;;;;N;;;0416;;0416
-0437;CYRILLIC SMALL LETTER ZE;Ll;0;L;;;;;N;;;0417;;0417
-0438;CYRILLIC SMALL LETTER I;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER II;;0418;;0418
-0439;CYRILLIC SMALL LETTER SHORT I;Ll;0;L;0438 0306;;;;N;CYRILLIC SMALL LETTER SHORT II;;0419;;0419
-043A;CYRILLIC SMALL LETTER KA;Ll;0;L;;;;;N;;;041A;;041A
-043B;CYRILLIC SMALL LETTER EL;Ll;0;L;;;;;N;;;041B;;041B
-043C;CYRILLIC SMALL LETTER EM;Ll;0;L;;;;;N;;;041C;;041C
-043D;CYRILLIC SMALL LETTER EN;Ll;0;L;;;;;N;;;041D;;041D
-043E;CYRILLIC SMALL LETTER O;Ll;0;L;;;;;N;;;041E;;041E
-043F;CYRILLIC SMALL LETTER PE;Ll;0;L;;;;;N;;;041F;;041F
-0440;CYRILLIC SMALL LETTER ER;Ll;0;L;;;;;N;;;0420;;0420
-0441;CYRILLIC SMALL LETTER ES;Ll;0;L;;;;;N;;;0421;;0421
-0442;CYRILLIC SMALL LETTER TE;Ll;0;L;;;;;N;;;0422;;0422
-0443;CYRILLIC SMALL LETTER U;Ll;0;L;;;;;N;;;0423;;0423
-0444;CYRILLIC SMALL LETTER EF;Ll;0;L;;;;;N;;;0424;;0424
-0445;CYRILLIC SMALL LETTER HA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KHA;;0425;;0425
-0446;CYRILLIC SMALL LETTER TSE;Ll;0;L;;;;;N;;;0426;;0426
-0447;CYRILLIC SMALL LETTER CHE;Ll;0;L;;;;;N;;;0427;;0427
-0448;CYRILLIC SMALL LETTER SHA;Ll;0;L;;;;;N;;;0428;;0428
-0449;CYRILLIC SMALL LETTER SHCHA;Ll;0;L;;;;;N;;;0429;;0429
-044A;CYRILLIC SMALL LETTER HARD SIGN;Ll;0;L;;;;;N;;;042A;;042A
-044B;CYRILLIC SMALL LETTER YERU;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER YERI;;042B;;042B
-044C;CYRILLIC SMALL LETTER SOFT SIGN;Ll;0;L;;;;;N;;;042C;;042C
-044D;CYRILLIC SMALL LETTER E;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER REVERSED E;;042D;;042D
-044E;CYRILLIC SMALL LETTER YU;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IU;;042E;;042E
-044F;CYRILLIC SMALL LETTER YA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IA;;042F;;042F
-0450;CYRILLIC SMALL LETTER IE WITH GRAVE;Ll;0;L;0435 0300;;;;N;;;0400;;0400
-0451;CYRILLIC SMALL LETTER IO;Ll;0;L;0435 0308;;;;N;;;0401;;0401
-0452;CYRILLIC SMALL LETTER DJE;Ll;0;L;;;;;N;;;0402;;0402
-0453;CYRILLIC SMALL LETTER GJE;Ll;0;L;0433 0301;;;;N;;;0403;;0403
-0454;CYRILLIC SMALL LETTER UKRAINIAN IE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER E;;0404;;0404
-0455;CYRILLIC SMALL LETTER DZE;Ll;0;L;;;;;N;;;0405;;0405
-0456;CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER I;;0406;;0406
-0457;CYRILLIC SMALL LETTER YI;Ll;0;L;0456 0308;;;;N;;;0407;;0407
-0458;CYRILLIC SMALL LETTER JE;Ll;0;L;;;;;N;;;0408;;0408
-0459;CYRILLIC SMALL LETTER LJE;Ll;0;L;;;;;N;;;0409;;0409
-045A;CYRILLIC SMALL LETTER NJE;Ll;0;L;;;;;N;;;040A;;040A
-045B;CYRILLIC SMALL LETTER TSHE;Ll;0;L;;;;;N;;;040B;;040B
-045C;CYRILLIC SMALL LETTER KJE;Ll;0;L;043A 0301;;;;N;;;040C;;040C
-045D;CYRILLIC SMALL LETTER I WITH GRAVE;Ll;0;L;0438 0300;;;;N;;;040D;;040D
-045E;CYRILLIC SMALL LETTER SHORT U;Ll;0;L;0443 0306;;;;N;;;040E;;040E
-045F;CYRILLIC SMALL LETTER DZHE;Ll;0;L;;;;;N;;;040F;;040F
-0460;CYRILLIC CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;0461;
-0461;CYRILLIC SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;0460;;0460
-0462;CYRILLIC CAPITAL LETTER YAT;Lu;0;L;;;;;N;;;;0463;
-0463;CYRILLIC SMALL LETTER YAT;Ll;0;L;;;;;N;;;0462;;0462
-0464;CYRILLIC CAPITAL LETTER IOTIFIED E;Lu;0;L;;;;;N;;;;0465;
-0465;CYRILLIC SMALL LETTER IOTIFIED E;Ll;0;L;;;;;N;;;0464;;0464
-0466;CYRILLIC CAPITAL LETTER LITTLE YUS;Lu;0;L;;;;;N;;;;0467;
-0467;CYRILLIC SMALL LETTER LITTLE YUS;Ll;0;L;;;;;N;;;0466;;0466
-0468;CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS;Lu;0;L;;;;;N;;;;0469;
-0469;CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS;Ll;0;L;;;;;N;;;0468;;0468
-046A;CYRILLIC CAPITAL LETTER BIG YUS;Lu;0;L;;;;;N;;;;046B;
-046B;CYRILLIC SMALL LETTER BIG YUS;Ll;0;L;;;;;N;;;046A;;046A
-046C;CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS;Lu;0;L;;;;;N;;;;046D;
-046D;CYRILLIC SMALL LETTER IOTIFIED BIG YUS;Ll;0;L;;;;;N;;;046C;;046C
-046E;CYRILLIC CAPITAL LETTER KSI;Lu;0;L;;;;;N;;;;046F;
-046F;CYRILLIC SMALL LETTER KSI;Ll;0;L;;;;;N;;;046E;;046E
-0470;CYRILLIC CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;0471;
-0471;CYRILLIC SMALL LETTER PSI;Ll;0;L;;;;;N;;;0470;;0470
-0472;CYRILLIC CAPITAL LETTER FITA;Lu;0;L;;;;;N;;;;0473;
-0473;CYRILLIC SMALL LETTER FITA;Ll;0;L;;;;;N;;;0472;;0472
-0474;CYRILLIC CAPITAL LETTER IZHITSA;Lu;0;L;;;;;N;;;;0475;
-0475;CYRILLIC SMALL LETTER IZHITSA;Ll;0;L;;;;;N;;;0474;;0474
-0476;CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT;Lu;0;L;0474 030F;;;;N;CYRILLIC CAPITAL LETTER IZHITSA DOUBLE GRAVE;;;0477;
-0477;CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT;Ll;0;L;0475 030F;;;;N;CYRILLIC SMALL LETTER IZHITSA DOUBLE GRAVE;;0476;;0476
-0478;CYRILLIC CAPITAL LETTER UK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER UK DIGRAPH;;;0479;
-0479;CYRILLIC SMALL LETTER UK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER UK DIGRAPH;;0478;;0478
-047A;CYRILLIC CAPITAL LETTER ROUND OMEGA;Lu;0;L;;;;;N;;;;047B;
-047B;CYRILLIC SMALL LETTER ROUND OMEGA;Ll;0;L;;;;;N;;;047A;;047A
-047C;CYRILLIC CAPITAL LETTER OMEGA WITH TITLO;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER OMEGA TITLO;;;047D;
-047D;CYRILLIC SMALL LETTER OMEGA WITH TITLO;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER OMEGA TITLO;;047C;;047C
-047E;CYRILLIC CAPITAL LETTER OT;Lu;0;L;;;;;N;;;;047F;
-047F;CYRILLIC SMALL LETTER OT;Ll;0;L;;;;;N;;;047E;;047E
-0480;CYRILLIC CAPITAL LETTER KOPPA;Lu;0;L;;;;;N;;;;0481;
-0481;CYRILLIC SMALL LETTER KOPPA;Ll;0;L;;;;;N;;;0480;;0480
-0482;CYRILLIC THOUSANDS SIGN;So;0;L;;;;;N;;;;;
-0483;COMBINING CYRILLIC TITLO;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING TITLO;;;;
-0484;COMBINING CYRILLIC PALATALIZATION;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PALATALIZATION;;;;
-0485;COMBINING CYRILLIC DASIA PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING DASIA PNEUMATA;;;;
-0486;COMBINING CYRILLIC PSILI PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PSILI PNEUMATA;;;;
-0487;COMBINING CYRILLIC POKRYTIE;Mn;230;NSM;;;;;N;;;;;
-0488;COMBINING CYRILLIC HUNDRED THOUSANDS SIGN;Me;0;NSM;;;;;N;;;;;
-0489;COMBINING CYRILLIC MILLIONS SIGN;Me;0;NSM;;;;;N;;;;;
-048A;CYRILLIC CAPITAL LETTER SHORT I WITH TAIL;Lu;0;L;;;;;N;;;;048B;
-048B;CYRILLIC SMALL LETTER SHORT I WITH TAIL;Ll;0;L;;;;;N;;;048A;;048A
-048C;CYRILLIC CAPITAL LETTER SEMISOFT SIGN;Lu;0;L;;;;;N;;;;048D;
-048D;CYRILLIC SMALL LETTER SEMISOFT SIGN;Ll;0;L;;;;;N;;;048C;;048C
-048E;CYRILLIC CAPITAL LETTER ER WITH TICK;Lu;0;L;;;;;N;;;;048F;
-048F;CYRILLIC SMALL LETTER ER WITH TICK;Ll;0;L;;;;;N;;;048E;;048E
-0490;CYRILLIC CAPITAL LETTER GHE WITH UPTURN;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE WITH UPTURN;;;0491;
-0491;CYRILLIC SMALL LETTER GHE WITH UPTURN;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE WITH UPTURN;;0490;;0490
-0492;CYRILLIC CAPITAL LETTER GHE WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE BAR;;;0493;
-0493;CYRILLIC SMALL LETTER GHE WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE BAR;;0492;;0492
-0494;CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE HOOK;;;0495;
-0495;CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE HOOK;;0494;;0494
-0496;CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ZHE WITH RIGHT DESCENDER;;;0497;
-0497;CYRILLIC SMALL LETTER ZHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ZHE WITH RIGHT DESCENDER;;0496;;0496
-0498;CYRILLIC CAPITAL LETTER ZE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ZE CEDILLA;;;0499;
-0499;CYRILLIC SMALL LETTER ZE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ZE CEDILLA;;0498;;0498
-049A;CYRILLIC CAPITAL LETTER KA WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA WITH RIGHT DESCENDER;;;049B;
-049B;CYRILLIC SMALL LETTER KA WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA WITH RIGHT DESCENDER;;049A;;049A
-049C;CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA VERTICAL BAR;;;049D;
-049D;CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA VERTICAL BAR;;049C;;049C
-049E;CYRILLIC CAPITAL LETTER KA WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA BAR;;;049F;
-049F;CYRILLIC SMALL LETTER KA WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA BAR;;049E;;049E
-04A0;CYRILLIC CAPITAL LETTER BASHKIR KA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER REVERSED GE KA;;;04A1;
-04A1;CYRILLIC SMALL LETTER BASHKIR KA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER REVERSED GE KA;;04A0;;04A0
-04A2;CYRILLIC CAPITAL LETTER EN WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN WITH RIGHT DESCENDER;;;04A3;
-04A3;CYRILLIC SMALL LETTER EN WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN WITH RIGHT DESCENDER;;04A2;;04A2
-04A4;CYRILLIC CAPITAL LIGATURE EN GHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN GE;;;04A5;
-04A5;CYRILLIC SMALL LIGATURE EN GHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN GE;;04A4;;04A4
-04A6;CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER PE HOOK;;;04A7;
-04A7;CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER PE HOOK;;04A6;;04A6
-04A8;CYRILLIC CAPITAL LETTER ABKHASIAN HA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER O HOOK;;;04A9;
-04A9;CYRILLIC SMALL LETTER ABKHASIAN HA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER O HOOK;;04A8;;04A8
-04AA;CYRILLIC CAPITAL LETTER ES WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ES CEDILLA;;;04AB;
-04AB;CYRILLIC SMALL LETTER ES WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ES CEDILLA;;04AA;;04AA
-04AC;CYRILLIC CAPITAL LETTER TE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER TE WITH RIGHT DESCENDER;;;04AD;
-04AD;CYRILLIC SMALL LETTER TE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER TE WITH RIGHT DESCENDER;;04AC;;04AC
-04AE;CYRILLIC CAPITAL LETTER STRAIGHT U;Lu;0;L;;;;;N;;;;04AF;
-04AF;CYRILLIC SMALL LETTER STRAIGHT U;Ll;0;L;;;;;N;;;04AE;;04AE
-04B0;CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER STRAIGHT U BAR;;;04B1;
-04B1;CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER STRAIGHT U BAR;;04B0;;04B0
-04B2;CYRILLIC CAPITAL LETTER HA WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KHA WITH RIGHT DESCENDER;;;04B3;
-04B3;CYRILLIC SMALL LETTER HA WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KHA WITH RIGHT DESCENDER;;04B2;;04B2
-04B4;CYRILLIC CAPITAL LIGATURE TE TSE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER TE TSE;;;04B5;
-04B5;CYRILLIC SMALL LIGATURE TE TSE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER TE TSE;;04B4;;04B4
-04B6;CYRILLIC CAPITAL LETTER CHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE WITH RIGHT DESCENDER;;;04B7;
-04B7;CYRILLIC SMALL LETTER CHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE WITH RIGHT DESCENDER;;04B6;;04B6
-04B8;CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE VERTICAL BAR;;;04B9;
-04B9;CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE VERTICAL BAR;;04B8;;04B8
-04BA;CYRILLIC CAPITAL LETTER SHHA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER H;;;04BB;
-04BB;CYRILLIC SMALL LETTER SHHA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER H;;04BA;;04BA
-04BC;CYRILLIC CAPITAL LETTER ABKHASIAN CHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IE HOOK;;;04BD;
-04BD;CYRILLIC SMALL LETTER ABKHASIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK;;04BC;;04BC
-04BE;CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IE HOOK OGONEK;;;04BF;
-04BF;CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK OGONEK;;04BE;;04BE
-04C0;CYRILLIC LETTER PALOCHKA;Lu;0;L;;;;;N;CYRILLIC LETTER I;;;04CF;
-04C1;CYRILLIC CAPITAL LETTER ZHE WITH BREVE;Lu;0;L;0416 0306;;;;N;CYRILLIC CAPITAL LETTER SHORT ZHE;;;04C2;
-04C2;CYRILLIC SMALL LETTER ZHE WITH BREVE;Ll;0;L;0436 0306;;;;N;CYRILLIC SMALL LETTER SHORT ZHE;;04C1;;04C1
-04C3;CYRILLIC CAPITAL LETTER KA WITH HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA HOOK;;;04C4;
-04C4;CYRILLIC SMALL LETTER KA WITH HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA HOOK;;04C3;;04C3
-04C5;CYRILLIC CAPITAL LETTER EL WITH TAIL;Lu;0;L;;;;;N;;;;04C6;
-04C6;CYRILLIC SMALL LETTER EL WITH TAIL;Ll;0;L;;;;;N;;;04C5;;04C5
-04C7;CYRILLIC CAPITAL LETTER EN WITH HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN HOOK;;;04C8;
-04C8;CYRILLIC SMALL LETTER EN WITH HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN HOOK;;04C7;;04C7
-04C9;CYRILLIC CAPITAL LETTER EN WITH TAIL;Lu;0;L;;;;;N;;;;04CA;
-04CA;CYRILLIC SMALL LETTER EN WITH TAIL;Ll;0;L;;;;;N;;;04C9;;04C9
-04CB;CYRILLIC CAPITAL LETTER KHAKASSIAN CHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE WITH LEFT DESCENDER;;;04CC;
-04CC;CYRILLIC SMALL LETTER KHAKASSIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE WITH LEFT DESCENDER;;04CB;;04CB
-04CD;CYRILLIC CAPITAL LETTER EM WITH TAIL;Lu;0;L;;;;;N;;;;04CE;
-04CE;CYRILLIC SMALL LETTER EM WITH TAIL;Ll;0;L;;;;;N;;;04CD;;04CD
-04CF;CYRILLIC SMALL LETTER PALOCHKA;Ll;0;L;;;;;N;;;04C0;;04C0
-04D0;CYRILLIC CAPITAL LETTER A WITH BREVE;Lu;0;L;0410 0306;;;;N;;;;04D1;
-04D1;CYRILLIC SMALL LETTER A WITH BREVE;Ll;0;L;0430 0306;;;;N;;;04D0;;04D0
-04D2;CYRILLIC CAPITAL LETTER A WITH DIAERESIS;Lu;0;L;0410 0308;;;;N;;;;04D3;
-04D3;CYRILLIC SMALL LETTER A WITH DIAERESIS;Ll;0;L;0430 0308;;;;N;;;04D2;;04D2
-04D4;CYRILLIC CAPITAL LIGATURE A IE;Lu;0;L;;;;;N;;;;04D5;
-04D5;CYRILLIC SMALL LIGATURE A IE;Ll;0;L;;;;;N;;;04D4;;04D4
-04D6;CYRILLIC CAPITAL LETTER IE WITH BREVE;Lu;0;L;0415 0306;;;;N;;;;04D7;
-04D7;CYRILLIC SMALL LETTER IE WITH BREVE;Ll;0;L;0435 0306;;;;N;;;04D6;;04D6
-04D8;CYRILLIC CAPITAL LETTER SCHWA;Lu;0;L;;;;;N;;;;04D9;
-04D9;CYRILLIC SMALL LETTER SCHWA;Ll;0;L;;;;;N;;;04D8;;04D8
-04DA;CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS;Lu;0;L;04D8 0308;;;;N;;;;04DB;
-04DB;CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS;Ll;0;L;04D9 0308;;;;N;;;04DA;;04DA
-04DC;CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS;Lu;0;L;0416 0308;;;;N;;;;04DD;
-04DD;CYRILLIC SMALL LETTER ZHE WITH DIAERESIS;Ll;0;L;0436 0308;;;;N;;;04DC;;04DC
-04DE;CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS;Lu;0;L;0417 0308;;;;N;;;;04DF;
-04DF;CYRILLIC SMALL LETTER ZE WITH DIAERESIS;Ll;0;L;0437 0308;;;;N;;;04DE;;04DE
-04E0;CYRILLIC CAPITAL LETTER ABKHASIAN DZE;Lu;0;L;;;;;N;;;;04E1;
-04E1;CYRILLIC SMALL LETTER ABKHASIAN DZE;Ll;0;L;;;;;N;;;04E0;;04E0
-04E2;CYRILLIC CAPITAL LETTER I WITH MACRON;Lu;0;L;0418 0304;;;;N;;;;04E3;
-04E3;CYRILLIC SMALL LETTER I WITH MACRON;Ll;0;L;0438 0304;;;;N;;;04E2;;04E2
-04E4;CYRILLIC CAPITAL LETTER I WITH DIAERESIS;Lu;0;L;0418 0308;;;;N;;;;04E5;
-04E5;CYRILLIC SMALL LETTER I WITH DIAERESIS;Ll;0;L;0438 0308;;;;N;;;04E4;;04E4
-04E6;CYRILLIC CAPITAL LETTER O WITH DIAERESIS;Lu;0;L;041E 0308;;;;N;;;;04E7;
-04E7;CYRILLIC SMALL LETTER O WITH DIAERESIS;Ll;0;L;043E 0308;;;;N;;;04E6;;04E6
-04E8;CYRILLIC CAPITAL LETTER BARRED O;Lu;0;L;;;;;N;;;;04E9;
-04E9;CYRILLIC SMALL LETTER BARRED O;Ll;0;L;;;;;N;;;04E8;;04E8
-04EA;CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS;Lu;0;L;04E8 0308;;;;N;;;;04EB;
-04EB;CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS;Ll;0;L;04E9 0308;;;;N;;;04EA;;04EA
-04EC;CYRILLIC CAPITAL LETTER E WITH DIAERESIS;Lu;0;L;042D 0308;;;;N;;;;04ED;
-04ED;CYRILLIC SMALL LETTER E WITH DIAERESIS;Ll;0;L;044D 0308;;;;N;;;04EC;;04EC
-04EE;CYRILLIC CAPITAL LETTER U WITH MACRON;Lu;0;L;0423 0304;;;;N;;;;04EF;
-04EF;CYRILLIC SMALL LETTER U WITH MACRON;Ll;0;L;0443 0304;;;;N;;;04EE;;04EE
-04F0;CYRILLIC CAPITAL LETTER U WITH DIAERESIS;Lu;0;L;0423 0308;;;;N;;;;04F1;
-04F1;CYRILLIC SMALL LETTER U WITH DIAERESIS;Ll;0;L;0443 0308;;;;N;;;04F0;;04F0
-04F2;CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE;Lu;0;L;0423 030B;;;;N;;;;04F3;
-04F3;CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE;Ll;0;L;0443 030B;;;;N;;;04F2;;04F2
-04F4;CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS;Lu;0;L;0427 0308;;;;N;;;;04F5;
-04F5;CYRILLIC SMALL LETTER CHE WITH DIAERESIS;Ll;0;L;0447 0308;;;;N;;;04F4;;04F4
-04F6;CYRILLIC CAPITAL LETTER GHE WITH DESCENDER;Lu;0;L;;;;;N;;;;04F7;
-04F7;CYRILLIC SMALL LETTER GHE WITH DESCENDER;Ll;0;L;;;;;N;;;04F6;;04F6
-04F8;CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS;Lu;0;L;042B 0308;;;;N;;;;04F9;
-04F9;CYRILLIC SMALL LETTER YERU WITH DIAERESIS;Ll;0;L;044B 0308;;;;N;;;04F8;;04F8
-04FA;CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK;Lu;0;L;;;;;N;;;;04FB;
-04FB;CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK;Ll;0;L;;;;;N;;;04FA;;04FA
-04FC;CYRILLIC CAPITAL LETTER HA WITH HOOK;Lu;0;L;;;;;N;;;;04FD;
-04FD;CYRILLIC SMALL LETTER HA WITH HOOK;Ll;0;L;;;;;N;;;04FC;;04FC
-04FE;CYRILLIC CAPITAL LETTER HA WITH STROKE;Lu;0;L;;;;;N;;;;04FF;
-04FF;CYRILLIC SMALL LETTER HA WITH STROKE;Ll;0;L;;;;;N;;;04FE;;04FE
-0500;CYRILLIC CAPITAL LETTER KOMI DE;Lu;0;L;;;;;N;;;;0501;
-0501;CYRILLIC SMALL LETTER KOMI DE;Ll;0;L;;;;;N;;;0500;;0500
-0502;CYRILLIC CAPITAL LETTER KOMI DJE;Lu;0;L;;;;;N;;;;0503;
-0503;CYRILLIC SMALL LETTER KOMI DJE;Ll;0;L;;;;;N;;;0502;;0502
-0504;CYRILLIC CAPITAL LETTER KOMI ZJE;Lu;0;L;;;;;N;;;;0505;
-0505;CYRILLIC SMALL LETTER KOMI ZJE;Ll;0;L;;;;;N;;;0504;;0504
-0506;CYRILLIC CAPITAL LETTER KOMI DZJE;Lu;0;L;;;;;N;;;;0507;
-0507;CYRILLIC SMALL LETTER KOMI DZJE;Ll;0;L;;;;;N;;;0506;;0506
-0508;CYRILLIC CAPITAL LETTER KOMI LJE;Lu;0;L;;;;;N;;;;0509;
-0509;CYRILLIC SMALL LETTER KOMI LJE;Ll;0;L;;;;;N;;;0508;;0508
-050A;CYRILLIC CAPITAL LETTER KOMI NJE;Lu;0;L;;;;;N;;;;050B;
-050B;CYRILLIC SMALL LETTER KOMI NJE;Ll;0;L;;;;;N;;;050A;;050A
-050C;CYRILLIC CAPITAL LETTER KOMI SJE;Lu;0;L;;;;;N;;;;050D;
-050D;CYRILLIC SMALL LETTER KOMI SJE;Ll;0;L;;;;;N;;;050C;;050C
-050E;CYRILLIC CAPITAL LETTER KOMI TJE;Lu;0;L;;;;;N;;;;050F;
-050F;CYRILLIC SMALL LETTER KOMI TJE;Ll;0;L;;;;;N;;;050E;;050E
-0510;CYRILLIC CAPITAL LETTER REVERSED ZE;Lu;0;L;;;;;N;;;;0511;
-0511;CYRILLIC SMALL LETTER REVERSED ZE;Ll;0;L;;;;;N;;;0510;;0510
-0512;CYRILLIC CAPITAL LETTER EL WITH HOOK;Lu;0;L;;;;;N;;;;0513;
-0513;CYRILLIC SMALL LETTER EL WITH HOOK;Ll;0;L;;;;;N;;;0512;;0512
-0514;CYRILLIC CAPITAL LETTER LHA;Lu;0;L;;;;;N;;;;0515;
-0515;CYRILLIC SMALL LETTER LHA;Ll;0;L;;;;;N;;;0514;;0514
-0516;CYRILLIC CAPITAL LETTER RHA;Lu;0;L;;;;;N;;;;0517;
-0517;CYRILLIC SMALL LETTER RHA;Ll;0;L;;;;;N;;;0516;;0516
-0518;CYRILLIC CAPITAL LETTER YAE;Lu;0;L;;;;;N;;;;0519;
-0519;CYRILLIC SMALL LETTER YAE;Ll;0;L;;;;;N;;;0518;;0518
-051A;CYRILLIC CAPITAL LETTER QA;Lu;0;L;;;;;N;;;;051B;
-051B;CYRILLIC SMALL LETTER QA;Ll;0;L;;;;;N;;;051A;;051A
-051C;CYRILLIC CAPITAL LETTER WE;Lu;0;L;;;;;N;;;;051D;
-051D;CYRILLIC SMALL LETTER WE;Ll;0;L;;;;;N;;;051C;;051C
-051E;CYRILLIC CAPITAL LETTER ALEUT KA;Lu;0;L;;;;;N;;;;051F;
-051F;CYRILLIC SMALL LETTER ALEUT KA;Ll;0;L;;;;;N;;;051E;;051E
-0520;CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;0521;
-0521;CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;0520;;0520
-0522;CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;0523;
-0523;CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;0522;;0522
-0524;CYRILLIC CAPITAL LETTER PE WITH DESCENDER;Lu;0;L;;;;;N;;;;0525;
-0525;CYRILLIC SMALL LETTER PE WITH DESCENDER;Ll;0;L;;;;;N;;;0524;;0524
-0526;CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER;Lu;0;L;;;;;N;;;;0527;
-0527;CYRILLIC SMALL LETTER SHHA WITH DESCENDER;Ll;0;L;;;;;N;;;0526;;0526
-0528;CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK;Lu;0;L;;;;;N;;;;0529;
-0529;CYRILLIC SMALL LETTER EN WITH LEFT HOOK;Ll;0;L;;;;;N;;;0528;;0528
-052A;CYRILLIC CAPITAL LETTER DZZHE;Lu;0;L;;;;;N;;;;052B;
-052B;CYRILLIC SMALL LETTER DZZHE;Ll;0;L;;;;;N;;;052A;;052A
-052C;CYRILLIC CAPITAL LETTER DCHE;Lu;0;L;;;;;N;;;;052D;
-052D;CYRILLIC SMALL LETTER DCHE;Ll;0;L;;;;;N;;;052C;;052C
-052E;CYRILLIC CAPITAL LETTER EL WITH DESCENDER;Lu;0;L;;;;;N;;;;052F;
-052F;CYRILLIC SMALL LETTER EL WITH DESCENDER;Ll;0;L;;;;;N;;;052E;;052E
-0531;ARMENIAN CAPITAL LETTER AYB;Lu;0;L;;;;;N;;;;0561;
-0532;ARMENIAN CAPITAL LETTER BEN;Lu;0;L;;;;;N;;;;0562;
-0533;ARMENIAN CAPITAL LETTER GIM;Lu;0;L;;;;;N;;;;0563;
-0534;ARMENIAN CAPITAL LETTER DA;Lu;0;L;;;;;N;;;;0564;
-0535;ARMENIAN CAPITAL LETTER ECH;Lu;0;L;;;;;N;;;;0565;
-0536;ARMENIAN CAPITAL LETTER ZA;Lu;0;L;;;;;N;;;;0566;
-0537;ARMENIAN CAPITAL LETTER EH;Lu;0;L;;;;;N;;;;0567;
-0538;ARMENIAN CAPITAL LETTER ET;Lu;0;L;;;;;N;;;;0568;
-0539;ARMENIAN CAPITAL LETTER TO;Lu;0;L;;;;;N;;;;0569;
-053A;ARMENIAN CAPITAL LETTER ZHE;Lu;0;L;;;;;N;;;;056A;
-053B;ARMENIAN CAPITAL LETTER INI;Lu;0;L;;;;;N;;;;056B;
-053C;ARMENIAN CAPITAL LETTER LIWN;Lu;0;L;;;;;N;;;;056C;
-053D;ARMENIAN CAPITAL LETTER XEH;Lu;0;L;;;;;N;;;;056D;
-053E;ARMENIAN CAPITAL LETTER CA;Lu;0;L;;;;;N;;;;056E;
-053F;ARMENIAN CAPITAL LETTER KEN;Lu;0;L;;;;;N;;;;056F;
-0540;ARMENIAN CAPITAL LETTER HO;Lu;0;L;;;;;N;;;;0570;
-0541;ARMENIAN CAPITAL LETTER JA;Lu;0;L;;;;;N;;;;0571;
-0542;ARMENIAN CAPITAL LETTER GHAD;Lu;0;L;;;;;N;ARMENIAN CAPITAL LETTER LAD;;;0572;
-0543;ARMENIAN CAPITAL LETTER CHEH;Lu;0;L;;;;;N;;;;0573;
-0544;ARMENIAN CAPITAL LETTER MEN;Lu;0;L;;;;;N;;;;0574;
-0545;ARMENIAN CAPITAL LETTER YI;Lu;0;L;;;;;N;;;;0575;
-0546;ARMENIAN CAPITAL LETTER NOW;Lu;0;L;;;;;N;;;;0576;
-0547;ARMENIAN CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;0577;
-0548;ARMENIAN CAPITAL LETTER VO;Lu;0;L;;;;;N;;;;0578;
-0549;ARMENIAN CAPITAL LETTER CHA;Lu;0;L;;;;;N;;;;0579;
-054A;ARMENIAN CAPITAL LETTER PEH;Lu;0;L;;;;;N;;;;057A;
-054B;ARMENIAN CAPITAL LETTER JHEH;Lu;0;L;;;;;N;;;;057B;
-054C;ARMENIAN CAPITAL LETTER RA;Lu;0;L;;;;;N;;;;057C;
-054D;ARMENIAN CAPITAL LETTER SEH;Lu;0;L;;;;;N;;;;057D;
-054E;ARMENIAN CAPITAL LETTER VEW;Lu;0;L;;;;;N;;;;057E;
-054F;ARMENIAN CAPITAL LETTER TIWN;Lu;0;L;;;;;N;;;;057F;
-0550;ARMENIAN CAPITAL LETTER REH;Lu;0;L;;;;;N;;;;0580;
-0551;ARMENIAN CAPITAL LETTER CO;Lu;0;L;;;;;N;;;;0581;
-0552;ARMENIAN CAPITAL LETTER YIWN;Lu;0;L;;;;;N;;;;0582;
-0553;ARMENIAN CAPITAL LETTER PIWR;Lu;0;L;;;;;N;;;;0583;
-0554;ARMENIAN CAPITAL LETTER KEH;Lu;0;L;;;;;N;;;;0584;
-0555;ARMENIAN CAPITAL LETTER OH;Lu;0;L;;;;;N;;;;0585;
-0556;ARMENIAN CAPITAL LETTER FEH;Lu;0;L;;;;;N;;;;0586;
-0559;ARMENIAN MODIFIER LETTER LEFT HALF RING;Lm;0;L;;;;;N;;;;;
-055A;ARMENIAN APOSTROPHE;Po;0;L;;;;;N;ARMENIAN MODIFIER LETTER RIGHT HALF RING;;;;
-055B;ARMENIAN EMPHASIS MARK;Po;0;L;;;;;N;;;;;
-055C;ARMENIAN EXCLAMATION MARK;Po;0;L;;;;;N;;;;;
-055D;ARMENIAN COMMA;Po;0;L;;;;;N;;;;;
-055E;ARMENIAN QUESTION MARK;Po;0;L;;;;;N;;;;;
-055F;ARMENIAN ABBREVIATION MARK;Po;0;L;;;;;N;;;;;
-0561;ARMENIAN SMALL LETTER AYB;Ll;0;L;;;;;N;;;0531;;0531
-0562;ARMENIAN SMALL LETTER BEN;Ll;0;L;;;;;N;;;0532;;0532
-0563;ARMENIAN SMALL LETTER GIM;Ll;0;L;;;;;N;;;0533;;0533
-0564;ARMENIAN SMALL LETTER DA;Ll;0;L;;;;;N;;;0534;;0534
-0565;ARMENIAN SMALL LETTER ECH;Ll;0;L;;;;;N;;;0535;;0535
-0566;ARMENIAN SMALL LETTER ZA;Ll;0;L;;;;;N;;;0536;;0536
-0567;ARMENIAN SMALL LETTER EH;Ll;0;L;;;;;N;;;0537;;0537
-0568;ARMENIAN SMALL LETTER ET;Ll;0;L;;;;;N;;;0538;;0538
-0569;ARMENIAN SMALL LETTER TO;Ll;0;L;;;;;N;;;0539;;0539
-056A;ARMENIAN SMALL LETTER ZHE;Ll;0;L;;;;;N;;;053A;;053A
-056B;ARMENIAN SMALL LETTER INI;Ll;0;L;;;;;N;;;053B;;053B
-056C;ARMENIAN SMALL LETTER LIWN;Ll;0;L;;;;;N;;;053C;;053C
-056D;ARMENIAN SMALL LETTER XEH;Ll;0;L;;;;;N;;;053D;;053D
-056E;ARMENIAN SMALL LETTER CA;Ll;0;L;;;;;N;;;053E;;053E
-056F;ARMENIAN SMALL LETTER KEN;Ll;0;L;;;;;N;;;053F;;053F
-0570;ARMENIAN SMALL LETTER HO;Ll;0;L;;;;;N;;;0540;;0540
-0571;ARMENIAN SMALL LETTER JA;Ll;0;L;;;;;N;;;0541;;0541
-0572;ARMENIAN SMALL LETTER GHAD;Ll;0;L;;;;;N;ARMENIAN SMALL LETTER LAD;;0542;;0542
-0573;ARMENIAN SMALL LETTER CHEH;Ll;0;L;;;;;N;;;0543;;0543
-0574;ARMENIAN SMALL LETTER MEN;Ll;0;L;;;;;N;;;0544;;0544
-0575;ARMENIAN SMALL LETTER YI;Ll;0;L;;;;;N;;;0545;;0545
-0576;ARMENIAN SMALL LETTER NOW;Ll;0;L;;;;;N;;;0546;;0546
-0577;ARMENIAN SMALL LETTER SHA;Ll;0;L;;;;;N;;;0547;;0547
-0578;ARMENIAN SMALL LETTER VO;Ll;0;L;;;;;N;;;0548;;0548
-0579;ARMENIAN SMALL LETTER CHA;Ll;0;L;;;;;N;;;0549;;0549
-057A;ARMENIAN SMALL LETTER PEH;Ll;0;L;;;;;N;;;054A;;054A
-057B;ARMENIAN SMALL LETTER JHEH;Ll;0;L;;;;;N;;;054B;;054B
-057C;ARMENIAN SMALL LETTER RA;Ll;0;L;;;;;N;;;054C;;054C
-057D;ARMENIAN SMALL LETTER SEH;Ll;0;L;;;;;N;;;054D;;054D
-057E;ARMENIAN SMALL LETTER VEW;Ll;0;L;;;;;N;;;054E;;054E
-057F;ARMENIAN SMALL LETTER TIWN;Ll;0;L;;;;;N;;;054F;;054F
-0580;ARMENIAN SMALL LETTER REH;Ll;0;L;;;;;N;;;0550;;0550
-0581;ARMENIAN SMALL LETTER CO;Ll;0;L;;;;;N;;;0551;;0551
-0582;ARMENIAN SMALL LETTER YIWN;Ll;0;L;;;;;N;;;0552;;0552
-0583;ARMENIAN SMALL LETTER PIWR;Ll;0;L;;;;;N;;;0553;;0553
-0584;ARMENIAN SMALL LETTER KEH;Ll;0;L;;;;;N;;;0554;;0554
-0585;ARMENIAN SMALL LETTER OH;Ll;0;L;;;;;N;;;0555;;0555
-0586;ARMENIAN SMALL LETTER FEH;Ll;0;L;;;;;N;;;0556;;0556
-0587;ARMENIAN SMALL LIGATURE ECH YIWN;Ll;0;L; 0565 0582;;;;N;;;;;
-0589;ARMENIAN FULL STOP;Po;0;L;;;;;N;ARMENIAN PERIOD;;;;
-058A;ARMENIAN HYPHEN;Pd;0;ON;;;;;N;;;;;
-058D;RIGHT-FACING ARMENIAN ETERNITY SIGN;So;0;ON;;;;;N;;;;;
-058E;LEFT-FACING ARMENIAN ETERNITY SIGN;So;0;ON;;;;;N;;;;;
-058F;ARMENIAN DRAM SIGN;Sc;0;ET;;;;;N;;;;;
-0591;HEBREW ACCENT ETNAHTA;Mn;220;NSM;;;;;N;;;;;
-0592;HEBREW ACCENT SEGOL;Mn;230;NSM;;;;;N;;;;;
-0593;HEBREW ACCENT SHALSHELET;Mn;230;NSM;;;;;N;;;;;
-0594;HEBREW ACCENT ZAQEF QATAN;Mn;230;NSM;;;;;N;;;;;
-0595;HEBREW ACCENT ZAQEF GADOL;Mn;230;NSM;;;;;N;;;;;
-0596;HEBREW ACCENT TIPEHA;Mn;220;NSM;;;;;N;;;;;
-0597;HEBREW ACCENT REVIA;Mn;230;NSM;;;;;N;;;;;
-0598;HEBREW ACCENT ZARQA;Mn;230;NSM;;;;;N;;;;;
-0599;HEBREW ACCENT PASHTA;Mn;230;NSM;;;;;N;;;;;
-059A;HEBREW ACCENT YETIV;Mn;222;NSM;;;;;N;;;;;
-059B;HEBREW ACCENT TEVIR;Mn;220;NSM;;;;;N;;;;;
-059C;HEBREW ACCENT GERESH;Mn;230;NSM;;;;;N;;;;;
-059D;HEBREW ACCENT GERESH MUQDAM;Mn;230;NSM;;;;;N;;;;;
-059E;HEBREW ACCENT GERSHAYIM;Mn;230;NSM;;;;;N;;;;;
-059F;HEBREW ACCENT QARNEY PARA;Mn;230;NSM;;;;;N;;;;;
-05A0;HEBREW ACCENT TELISHA GEDOLA;Mn;230;NSM;;;;;N;;;;;
-05A1;HEBREW ACCENT PAZER;Mn;230;NSM;;;;;N;;;;;
-05A2;HEBREW ACCENT ATNAH HAFUKH;Mn;220;NSM;;;;;N;;;;;
-05A3;HEBREW ACCENT MUNAH;Mn;220;NSM;;;;;N;;;;;
-05A4;HEBREW ACCENT MAHAPAKH;Mn;220;NSM;;;;;N;;;;;
-05A5;HEBREW ACCENT MERKHA;Mn;220;NSM;;;;;N;;;;;
-05A6;HEBREW ACCENT MERKHA KEFULA;Mn;220;NSM;;;;;N;;;;;
-05A7;HEBREW ACCENT DARGA;Mn;220;NSM;;;;;N;;;;;
-05A8;HEBREW ACCENT QADMA;Mn;230;NSM;;;;;N;;;;;
-05A9;HEBREW ACCENT TELISHA QETANA;Mn;230;NSM;;;;;N;;;;;
-05AA;HEBREW ACCENT YERAH BEN YOMO;Mn;220;NSM;;;;;N;;;;;
-05AB;HEBREW ACCENT OLE;Mn;230;NSM;;;;;N;;;;;
-05AC;HEBREW ACCENT ILUY;Mn;230;NSM;;;;;N;;;;;
-05AD;HEBREW ACCENT DEHI;Mn;222;NSM;;;;;N;;;;;
-05AE;HEBREW ACCENT ZINOR;Mn;228;NSM;;;;;N;;;;;
-05AF;HEBREW MARK MASORA CIRCLE;Mn;230;NSM;;;;;N;;;;;
-05B0;HEBREW POINT SHEVA;Mn;10;NSM;;;;;N;;;;;
-05B1;HEBREW POINT HATAF SEGOL;Mn;11;NSM;;;;;N;;;;;
-05B2;HEBREW POINT HATAF PATAH;Mn;12;NSM;;;;;N;;;;;
-05B3;HEBREW POINT HATAF QAMATS;Mn;13;NSM;;;;;N;;;;;
-05B4;HEBREW POINT HIRIQ;Mn;14;NSM;;;;;N;;;;;
-05B5;HEBREW POINT TSERE;Mn;15;NSM;;;;;N;;;;;
-05B6;HEBREW POINT SEGOL;Mn;16;NSM;;;;;N;;;;;
-05B7;HEBREW POINT PATAH;Mn;17;NSM;;;;;N;;;;;
-05B8;HEBREW POINT QAMATS;Mn;18;NSM;;;;;N;;;;;
-05B9;HEBREW POINT HOLAM;Mn;19;NSM;;;;;N;;;;;
-05BA;HEBREW POINT HOLAM HASER FOR VAV;Mn;19;NSM;;;;;N;;;;;
-05BB;HEBREW POINT QUBUTS;Mn;20;NSM;;;;;N;;;;;
-05BC;HEBREW POINT DAGESH OR MAPIQ;Mn;21;NSM;;;;;N;HEBREW POINT DAGESH;;;;
-05BD;HEBREW POINT METEG;Mn;22;NSM;;;;;N;;;;;
-05BE;HEBREW PUNCTUATION MAQAF;Pd;0;R;;;;;N;;;;;
-05BF;HEBREW POINT RAFE;Mn;23;NSM;;;;;N;;;;;
-05C0;HEBREW PUNCTUATION PASEQ;Po;0;R;;;;;N;HEBREW POINT PASEQ;;;;
-05C1;HEBREW POINT SHIN DOT;Mn;24;NSM;;;;;N;;;;;
-05C2;HEBREW POINT SIN DOT;Mn;25;NSM;;;;;N;;;;;
-05C3;HEBREW PUNCTUATION SOF PASUQ;Po;0;R;;;;;N;;;;;
-05C4;HEBREW MARK UPPER DOT;Mn;230;NSM;;;;;N;;;;;
-05C5;HEBREW MARK LOWER DOT;Mn;220;NSM;;;;;N;;;;;
-05C6;HEBREW PUNCTUATION NUN HAFUKHA;Po;0;R;;;;;N;;;;;
-05C7;HEBREW POINT QAMATS QATAN;Mn;18;NSM;;;;;N;;;;;
-05D0;HEBREW LETTER ALEF;Lo;0;R;;;;;N;;;;;
-05D1;HEBREW LETTER BET;Lo;0;R;;;;;N;;;;;
-05D2;HEBREW LETTER GIMEL;Lo;0;R;;;;;N;;;;;
-05D3;HEBREW LETTER DALET;Lo;0;R;;;;;N;;;;;
-05D4;HEBREW LETTER HE;Lo;0;R;;;;;N;;;;;
-05D5;HEBREW LETTER VAV;Lo;0;R;;;;;N;;;;;
-05D6;HEBREW LETTER ZAYIN;Lo;0;R;;;;;N;;;;;
-05D7;HEBREW LETTER HET;Lo;0;R;;;;;N;;;;;
-05D8;HEBREW LETTER TET;Lo;0;R;;;;;N;;;;;
-05D9;HEBREW LETTER YOD;Lo;0;R;;;;;N;;;;;
-05DA;HEBREW LETTER FINAL KAF;Lo;0;R;;;;;N;;;;;
-05DB;HEBREW LETTER KAF;Lo;0;R;;;;;N;;;;;
-05DC;HEBREW LETTER LAMED;Lo;0;R;;;;;N;;;;;
-05DD;HEBREW LETTER FINAL MEM;Lo;0;R;;;;;N;;;;;
-05DE;HEBREW LETTER MEM;Lo;0;R;;;;;N;;;;;
-05DF;HEBREW LETTER FINAL NUN;Lo;0;R;;;;;N;;;;;
-05E0;HEBREW LETTER NUN;Lo;0;R;;;;;N;;;;;
-05E1;HEBREW LETTER SAMEKH;Lo;0;R;;;;;N;;;;;
-05E2;HEBREW LETTER AYIN;Lo;0;R;;;;;N;;;;;
-05E3;HEBREW LETTER FINAL PE;Lo;0;R;;;;;N;;;;;
-05E4;HEBREW LETTER PE;Lo;0;R;;;;;N;;;;;
-05E5;HEBREW LETTER FINAL TSADI;Lo;0;R;;;;;N;;;;;
-05E6;HEBREW LETTER TSADI;Lo;0;R;;;;;N;;;;;
-05E7;HEBREW LETTER QOF;Lo;0;R;;;;;N;;;;;
-05E8;HEBREW LETTER RESH;Lo;0;R;;;;;N;;;;;
-05E9;HEBREW LETTER SHIN;Lo;0;R;;;;;N;;;;;
-05EA;HEBREW LETTER TAV;Lo;0;R;;;;;N;;;;;
-05F0;HEBREW LIGATURE YIDDISH DOUBLE VAV;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE VAV;;;;
-05F1;HEBREW LIGATURE YIDDISH VAV YOD;Lo;0;R;;;;;N;HEBREW LETTER VAV YOD;;;;
-05F2;HEBREW LIGATURE YIDDISH DOUBLE YOD;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE YOD;;;;
-05F3;HEBREW PUNCTUATION GERESH;Po;0;R;;;;;N;;;;;
-05F4;HEBREW PUNCTUATION GERSHAYIM;Po;0;R;;;;;N;;;;;
-0600;ARABIC NUMBER SIGN;Cf;0;AN;;;;;N;;;;;
-0601;ARABIC SIGN SANAH;Cf;0;AN;;;;;N;;;;;
-0602;ARABIC FOOTNOTE MARKER;Cf;0;AN;;;;;N;;;;;
-0603;ARABIC SIGN SAFHA;Cf;0;AN;;;;;N;;;;;
-0604;ARABIC SIGN SAMVAT;Cf;0;AN;;;;;N;;;;;
-0605;ARABIC NUMBER MARK ABOVE;Cf;0;AN;;;;;N;;;;;
-0606;ARABIC-INDIC CUBE ROOT;Sm;0;ON;;;;;N;;;;;
-0607;ARABIC-INDIC FOURTH ROOT;Sm;0;ON;;;;;N;;;;;
-0608;ARABIC RAY;Sm;0;AL;;;;;N;;;;;
-0609;ARABIC-INDIC PER MILLE SIGN;Po;0;ET;;;;;N;;;;;
-060A;ARABIC-INDIC PER TEN THOUSAND SIGN;Po;0;ET;;;;;N;;;;;
-060B;AFGHANI SIGN;Sc;0;AL;;;;;N;;;;;
-060C;ARABIC COMMA;Po;0;CS;;;;;N;;;;;
-060D;ARABIC DATE SEPARATOR;Po;0;AL;;;;;N;;;;;
-060E;ARABIC POETIC VERSE SIGN;So;0;ON;;;;;N;;;;;
-060F;ARABIC SIGN MISRA;So;0;ON;;;;;N;;;;;
-0610;ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM;Mn;230;NSM;;;;;N;;;;;
-0611;ARABIC SIGN ALAYHE ASSALLAM;Mn;230;NSM;;;;;N;;;;;
-0612;ARABIC SIGN RAHMATULLAH ALAYHE;Mn;230;NSM;;;;;N;;;;;
-0613;ARABIC SIGN RADI ALLAHOU ANHU;Mn;230;NSM;;;;;N;;;;;
-0614;ARABIC SIGN TAKHALLUS;Mn;230;NSM;;;;;N;;;;;
-0615;ARABIC SMALL HIGH TAH;Mn;230;NSM;;;;;N;;;;;
-0616;ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH;Mn;230;NSM;;;;;N;;;;;
-0617;ARABIC SMALL HIGH ZAIN;Mn;230;NSM;;;;;N;;;;;
-0618;ARABIC SMALL FATHA;Mn;30;NSM;;;;;N;;;;;
-0619;ARABIC SMALL DAMMA;Mn;31;NSM;;;;;N;;;;;
-061A;ARABIC SMALL KASRA;Mn;32;NSM;;;;;N;;;;;
-061B;ARABIC SEMICOLON;Po;0;AL;;;;;N;;;;;
-061C;ARABIC LETTER MARK;Cf;0;AL;;;;;N;;;;;
-061E;ARABIC TRIPLE DOT PUNCTUATION MARK;Po;0;AL;;;;;N;;;;;
-061F;ARABIC QUESTION MARK;Po;0;AL;;;;;N;;;;;
-0620;ARABIC LETTER KASHMIRI YEH;Lo;0;AL;;;;;N;;;;;
-0621;ARABIC LETTER HAMZA;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAH;;;;
-0622;ARABIC LETTER ALEF WITH MADDA ABOVE;Lo;0;AL;0627 0653;;;;N;ARABIC LETTER MADDAH ON ALEF;;;;
-0623;ARABIC LETTER ALEF WITH HAMZA ABOVE;Lo;0;AL;0627 0654;;;;N;ARABIC LETTER HAMZAH ON ALEF;;;;
-0624;ARABIC LETTER WAW WITH HAMZA ABOVE;Lo;0;AL;0648 0654;;;;N;ARABIC LETTER HAMZAH ON WAW;;;;
-0625;ARABIC LETTER ALEF WITH HAMZA BELOW;Lo;0;AL;0627 0655;;;;N;ARABIC LETTER HAMZAH UNDER ALEF;;;;
-0626;ARABIC LETTER YEH WITH HAMZA ABOVE;Lo;0;AL;064A 0654;;;;N;ARABIC LETTER HAMZAH ON YA;;;;
-0627;ARABIC LETTER ALEF;Lo;0;AL;;;;;N;;;;;
-0628;ARABIC LETTER BEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA;;;;
-0629;ARABIC LETTER TEH MARBUTA;Lo;0;AL;;;;;N;ARABIC LETTER TAA MARBUTAH;;;;
-062A;ARABIC LETTER TEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA;;;;
-062B;ARABIC LETTER THEH;Lo;0;AL;;;;;N;ARABIC LETTER THAA;;;;
-062C;ARABIC LETTER JEEM;Lo;0;AL;;;;;N;;;;;
-062D;ARABIC LETTER HAH;Lo;0;AL;;;;;N;ARABIC LETTER HAA;;;;
-062E;ARABIC LETTER KHAH;Lo;0;AL;;;;;N;ARABIC LETTER KHAA;;;;
-062F;ARABIC LETTER DAL;Lo;0;AL;;;;;N;;;;;
-0630;ARABIC LETTER THAL;Lo;0;AL;;;;;N;;;;;
-0631;ARABIC LETTER REH;Lo;0;AL;;;;;N;ARABIC LETTER RA;;;;
-0632;ARABIC LETTER ZAIN;Lo;0;AL;;;;;N;;;;;
-0633;ARABIC LETTER SEEN;Lo;0;AL;;;;;N;;;;;
-0634;ARABIC LETTER SHEEN;Lo;0;AL;;;;;N;;;;;
-0635;ARABIC LETTER SAD;Lo;0;AL;;;;;N;;;;;
-0636;ARABIC LETTER DAD;Lo;0;AL;;;;;N;;;;;
-0637;ARABIC LETTER TAH;Lo;0;AL;;;;;N;;;;;
-0638;ARABIC LETTER ZAH;Lo;0;AL;;;;;N;ARABIC LETTER DHAH;;;;
-0639;ARABIC LETTER AIN;Lo;0;AL;;;;;N;;;;;
-063A;ARABIC LETTER GHAIN;Lo;0;AL;;;;;N;;;;;
-063B;ARABIC LETTER KEHEH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
-063C;ARABIC LETTER KEHEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;;
-063D;ARABIC LETTER FARSI YEH WITH INVERTED V;Lo;0;AL;;;;;N;;;;;
-063E;ARABIC LETTER FARSI YEH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
-063F;ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
-0640;ARABIC TATWEEL;Lm;0;AL;;;;;N;;;;;
-0641;ARABIC LETTER FEH;Lo;0;AL;;;;;N;ARABIC LETTER FA;;;;
-0642;ARABIC LETTER QAF;Lo;0;AL;;;;;N;;;;;
-0643;ARABIC LETTER KAF;Lo;0;AL;;;;;N;ARABIC LETTER CAF;;;;
-0644;ARABIC LETTER LAM;Lo;0;AL;;;;;N;;;;;
-0645;ARABIC LETTER MEEM;Lo;0;AL;;;;;N;;;;;
-0646;ARABIC LETTER NOON;Lo;0;AL;;;;;N;;;;;
-0647;ARABIC LETTER HEH;Lo;0;AL;;;;;N;ARABIC LETTER HA;;;;
-0648;ARABIC LETTER WAW;Lo;0;AL;;;;;N;;;;;
-0649;ARABIC LETTER ALEF MAKSURA;Lo;0;AL;;;;;N;ARABIC LETTER ALEF MAQSURAH;;;;
-064A;ARABIC LETTER YEH;Lo;0;AL;;;;;N;ARABIC LETTER YA;;;;
-064B;ARABIC FATHATAN;Mn;27;NSM;;;;;N;;;;;
-064C;ARABIC DAMMATAN;Mn;28;NSM;;;;;N;;;;;
-064D;ARABIC KASRATAN;Mn;29;NSM;;;;;N;;;;;
-064E;ARABIC FATHA;Mn;30;NSM;;;;;N;ARABIC FATHAH;;;;
-064F;ARABIC DAMMA;Mn;31;NSM;;;;;N;ARABIC DAMMAH;;;;
-0650;ARABIC KASRA;Mn;32;NSM;;;;;N;ARABIC KASRAH;;;;
-0651;ARABIC SHADDA;Mn;33;NSM;;;;;N;ARABIC SHADDAH;;;;
-0652;ARABIC SUKUN;Mn;34;NSM;;;;;N;;;;;
-0653;ARABIC MADDAH ABOVE;Mn;230;NSM;;;;;N;;;;;
-0654;ARABIC HAMZA ABOVE;Mn;230;NSM;;;;;N;;;;;
-0655;ARABIC HAMZA BELOW;Mn;220;NSM;;;;;N;;;;;
-0656;ARABIC SUBSCRIPT ALEF;Mn;220;NSM;;;;;N;;;;;
-0657;ARABIC INVERTED DAMMA;Mn;230;NSM;;;;;N;;;;;
-0658;ARABIC MARK NOON GHUNNA;Mn;230;NSM;;;;;N;;;;;
-0659;ARABIC ZWARAKAY;Mn;230;NSM;;;;;N;;;;;
-065A;ARABIC VOWEL SIGN SMALL V ABOVE;Mn;230;NSM;;;;;N;;;;;
-065B;ARABIC VOWEL SIGN INVERTED SMALL V ABOVE;Mn;230;NSM;;;;;N;;;;;
-065C;ARABIC VOWEL SIGN DOT BELOW;Mn;220;NSM;;;;;N;;;;;
-065D;ARABIC REVERSED DAMMA;Mn;230;NSM;;;;;N;;;;;
-065E;ARABIC FATHA WITH TWO DOTS;Mn;230;NSM;;;;;N;;;;;
-065F;ARABIC WAVY HAMZA BELOW;Mn;220;NSM;;;;;N;;;;;
-0660;ARABIC-INDIC DIGIT ZERO;Nd;0;AN;;0;0;0;N;;;;;
-0661;ARABIC-INDIC DIGIT ONE;Nd;0;AN;;1;1;1;N;;;;;
-0662;ARABIC-INDIC DIGIT TWO;Nd;0;AN;;2;2;2;N;;;;;
-0663;ARABIC-INDIC DIGIT THREE;Nd;0;AN;;3;3;3;N;;;;;
-0664;ARABIC-INDIC DIGIT FOUR;Nd;0;AN;;4;4;4;N;;;;;
-0665;ARABIC-INDIC DIGIT FIVE;Nd;0;AN;;5;5;5;N;;;;;
-0666;ARABIC-INDIC DIGIT SIX;Nd;0;AN;;6;6;6;N;;;;;
-0667;ARABIC-INDIC DIGIT SEVEN;Nd;0;AN;;7;7;7;N;;;;;
-0668;ARABIC-INDIC DIGIT EIGHT;Nd;0;AN;;8;8;8;N;;;;;
-0669;ARABIC-INDIC DIGIT NINE;Nd;0;AN;;9;9;9;N;;;;;
-066A;ARABIC PERCENT SIGN;Po;0;ET;;;;;N;;;;;
-066B;ARABIC DECIMAL SEPARATOR;Po;0;AN;;;;;N;;;;;
-066C;ARABIC THOUSANDS SEPARATOR;Po;0;AN;;;;;N;;;;;
-066D;ARABIC FIVE POINTED STAR;Po;0;AL;;;;;N;;;;;
-066E;ARABIC LETTER DOTLESS BEH;Lo;0;AL;;;;;N;;;;;
-066F;ARABIC LETTER DOTLESS QAF;Lo;0;AL;;;;;N;;;;;
-0670;ARABIC LETTER SUPERSCRIPT ALEF;Mn;35;NSM;;;;;N;ARABIC ALEF ABOVE;;;;
-0671;ARABIC LETTER ALEF WASLA;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAT WASL ON ALEF;;;;
-0672;ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER WAVY HAMZAH ON ALEF;;;;
-0673;ARABIC LETTER ALEF WITH WAVY HAMZA BELOW;Lo;0;AL;;;;;N;ARABIC LETTER WAVY HAMZAH UNDER ALEF;;;;
-0674;ARABIC LETTER HIGH HAMZA;Lo;0;AL;;;;;N;ARABIC LETTER HIGH HAMZAH;;;;
-0675;ARABIC LETTER HIGH HAMZA ALEF;Lo;0;AL;