Note
ãã®ããŒãžã«ã¢ã¯ã»ã¹ããã«ã¯ãæ¿èªãå¿ èŠã§ãã ãµã€ã³ã€ã³ãŸãã¯ãã£ã¬ã¯ããªã®å€æŽã詊ãããšãã§ããŸãã
ãã®ããŒãžã«ã¢ã¯ã»ã¹ããã«ã¯ãæ¿èªãå¿ èŠã§ãã ãã£ã¬ã¯ããªã®å€æŽã詊ãããšãã§ããŸãã
.NET 5 ããåã§ã¯ã.NET ã°ããŒããªãŒãŒã·ã§ã³ API ã¯ããã©ãããã©ãŒã ããšã«å¥ã ã®åºã«ãªãã©ã€ãã©ãªã䜿çšããŠããŸããã ãã® API ã¯ãUnix ã§ã¯ãICU (International Components for Unicode) ã䜿çšããWindows ã§ã¯ãååœèªãµããŒã (NLS) ã䜿çšããŠããŸããã ããã«ãããã¢ããªã±ãŒã·ã§ã³ãå®è¡ãããšããããã€ãã®ã°ããŒããªãŒãŒã·ã§ã³ API ã®åäœããã©ãããã©ãŒã ã«ãã£ãŠéãããšããããŸããã æ¬¡ã®é åã§ãåäœãéãããšãããã£ãŠããŸãã
- æåãšæåããŒã¿
- æåã®å€§æåå°æå
- æååã®äžŠã¹æ¿ããšæ€çŽ¢
- äžŠã¹æ¿ãããŒ
- æåã®æ£èŠå
- åœéåãã¡ã€ã³å (IDN) ã®ãµããŒã
- Linux ã®ã¿ã€ã ãŸãŒã³ã®è¡šç€ºå
.NET 5 以éã§ã¯ããã©ãããã©ãŒã ã«ãã£ãŠã¢ããªã±ãŒã·ã§ã³ã«éããã§ãããšããªããããéçºè ãåºã«ãªãã©ã€ãã©ãªãããå¶åŸ¡ã§ããããã«ãªããŸããã
泚
ICU ã©ã€ãã©ãªã®åäœãå¶åŸ¡ããã«ã«ã㣠ããŒã¿ã¯ãéåžžãã©ã³ã¿ã€ã ã§ã¯ãªããå ±éãã±ãŒã« ããŒã¿ ãªããžã㪠(CLDR) ã«ãã£ãŠä¿å®ãããŸãã
Windows äžã® ICU
Windows ã§ã¯ãã°ããŒããªãŒãŒã·ã§ã³ ã¿ã¹ã¯ã«èªåçã«æ¡çšãããæ©èœã®äžéšãšããŠãããªã€ã³ã¹ããŒã«ããã icu.dll ããŒãžã§ã³ãçµã¿èŸŒãŸããŸããã ãã®å€æŽã«ããã.NET ã§ãã® ICU ã©ã€ãã©ãªã掻çšããŠã°ããŒããªãŒãŒã·ã§ã³ããµããŒãã§ããããã«ãªããŸããã 以åã® Windows ããŒãžã§ã³ã®ããã«ãICU ã©ã€ãã©ãªãå©çšã§ããªãããŸãã¯èªã¿èŸŒããªãå Žåã.NET 5 以éã®ããŒãžã§ã³ã§ã¯ãNLS ããŒã¹ã®å®è£ ã䜿çšããŸãã
次ã®è¡šã¯ãç°ãªã Windows ã¯ã©ã€ã¢ã³ããšãµãŒããŒã®ããŒãžã§ã³éã§ãICU ã©ã€ãã©ãªãèªã¿èŸŒãã .NET ã®ããŒãžã§ã³ã瀺ãããã®ã§ãã
| .NET ããŒãžã§ã³ | Windows ããŒãžã§ã³ |
|---|---|
| .NET 5 ãŸã㯠.NET 6 | Windows Client 10 ããŒãžã§ã³ 1903 以é |
| .NET 5 ãŸã㯠.NET 6 | Windows Server 2022 以é |
| .NET 7 以é | Windows Client 10 ããŒãžã§ã³ 1703 以é |
| .NET 7 以é | Windows Server 2019 ãŸãã¯ãã以é |
泚
.NET 7 以éã®ããŒãžã§ã³ã«ã¯ã.NET 6 ã .NET 5 ãšã¯å¯Ÿç §çã«ã以åã® Windows ããŒãžã§ã³ã§ã ICU ãèªã¿èŸŒãæ©èœããããŸãã
泚
ICU ã䜿çšããŠããå Žåã§ããCurrentCultureãCurrentUICultureãããã³ CurrentRegion ã®ã¡ã³ããŒã¯ããŠãŒã¶ãŒèšå®ãåæ ããããã«ãWindows ãªãã¬ãŒãã£ã³ã° ã·ã¹ãã ã® API ã䜿çšããŸãã
åäœã®éã
.NET 5 以éã察象ã«ããããã«ã¢ããªãã¢ããã°ã¬ãŒããããšãã°ããŒããªãŒãŒã·ã§ã³æ©èœã䜿çšããŠããããšãèªèããŠããªãå Žåã§ããã¢ããªã§ã®å€æŽã«æ°ä»ãããšããããŸãã æ¬¡ã®ã»ã¯ã·ã§ã³ã§ã¯ãçºçããå¯èœæ§ã®ããåäœã®å€æŽãããã€ã瀺ããŸãã
æååã®äžŠã¹æ¿ããš System.Globalization.CompareOptions
CompareOptions 㯠String.Compare ã«æž¡ãããšãã§ãããªãã·ã§ã³ã®åæåã§ã2 ã€ã®æååã®æ¯èŒæ¹æ³ã«åœ±é¿ãäžããŸãã
ç䟡æ§ã«ã€ããŠã®æååã®æ¯èŒããäžŠã¹æ¿ãé åºã®æ±ºå®ã®æ¹æ³ã¯ãNLS ãš ICU ã§ç°ãªããŸãã ç¹ã«æ¬¡ã®ç¹ã«éãããããŸãã
- æ¢å®ã®æååã®äžŠã¹æ¿ãé åºãç°ãªãããã
CompareOptionsãçŽæ¥äœ¿çšããªãå Žåã§ãããã®éãã¯æããã«ãªããŸãã ICU ã䜿çšããå ŽåãNoneã®æ¢å®ã®ãªãã·ã§ã³ã¯StringSortãšåãããã«å®è¡ãããŸããStringSortã¯ãè±æ°å以å€ã®æåãè±æ°åã®åã«äžŠã¹æ¿ããŸã (ããšãã°ã"bill's" 㯠"bills" ã®åã«äžŠã¹æ¿ããããŸã)ã 以åã®Noneæ©èœã埩å ããã«ã¯ãNLS ããŒã¹ã®å®è£ ã䜿çšããå¿ èŠããããŸãã - ååæåã®æ¢å®ã®åŠçã¯ç°ãªããŸãã NLS ã§ã¯ãçµåæåãšãã以å€ã®æå ("oeuf" ãš "Åuf" ãªã©) ã¯çãããšèŠãªãããŸããã.NET ã® ICU ã§ã¯åãã«æ±ãããŸããã ããã¯ã2 ã€ã®å®è£
éã§ç
§åé åºã®åŒ·åºŠãç°ãªãããã§ãã ICU äœ¿çšæã« NLS åäœã埩å
ããã«ã¯ã
CompareOptions.IgnoreNonSpaceå€ã䜿çšããŸãã
String.IndexOf
æååå
ã® nulll æå String.IndexOf(String) ã®ã€ã³ããã¯ã¹ã調ã¹ãããã« \0 ãåŒã³åºã次ã®ã³ãŒãã«ã€ããŠèããŸãã
const string greeting = "Hel\0lo";
Console.WriteLine($"{greeting.IndexOf("\0")}");
Console.WriteLine($"{greeting.IndexOf("\0", StringComparison.CurrentCulture)}");
Console.WriteLine($"{greeting.IndexOf("\0", StringComparison.Ordinal)}");
- Windows ã® .NET Core 3.1 以åã®ããŒãžã§ã³ã§ã¯ã3 è¡ããšã«
3ãã¹ããããã«ãã£ãŠåºåãããŸãã -
ICU on Windows ã»ã¯ã·ã§ã³ã®è¡šã«èšèŒãããŠãã Windows ããŒãžã§ã³ã§å®è¡ãããŠãã .NET 5 以éã®ããŒãžã§ã³ã§ã¯ãã¹ããããã¯
0ã0ã3(åºæ°æ€çŽ¢çš) ãåºåããŸãã
æ¢å®ã§ã¯ãString.IndexOf(String) ã«ãã£ãŠãã«ã«ãã£ã«å¯Ÿå¿ããèšèªæ€çŽ¢ãå®è¡ãããŸãã ICU ã§ã¯ãnull æå \0 ã "0 ã®éã¿ä»ãæå" ãšèŠãªããŸãããããã£ãŠã.NET 5 以éã§èšèªæ€çŽ¢ã䜿çšããå Žåãæååå
ã®ãã®æåã¯æ€çŽ¢ãããŸããã ãã ããNLS ã§ã¯ null æå \0 㯠0 ã®éã¿ä»ãæåãšã¯èŠãªãããã.NET Core 3.1 以åã§èšèªæ€çŽ¢ãè¡ããšããã®æåã¯äœçœ® 3 ã§æ€çŽ¢ãããŸãã åºæ°æ€çŽ¢ãè¡ããšããã¹ãŠã® .NET ããŒãžã§ã³ã®äœçœ® 3 ã§è©²åœããæåãæ€çŽ¢ãããŸãã
ã³ãŒãåæèŠåãCA1307: æå³ãæç¢ºã«ããããã® StringComparison ã®æå®ãããã³ãCA1309: é åºã瀺ã StringComparison ã䜿çšããŸããã«åŸããšãæå忝èŒãæå®ãããŠããªãããŸãã¯åºæ°ã§ã¯ãªãã³ãŒãå ã®åŒã³åºããµã€ããæ€çŽ¢ã§ããŸãã
詳现ã«ã€ããŠã¯ãã .NET ã®æååãæ¯èŒããããã®ãã¹ã ãã©ã¯ãã£ã¹ããåç §ããŠãã ããã
String.EndsWith
const string foo = "abc";
Console.WriteLine(foo.EndsWith("\0"));
Console.WriteLine(foo.EndsWith("c"));
Console.WriteLine(foo.EndsWith("\0", StringComparison.CurrentCulture));
Console.WriteLine(foo.EndsWith("\0", StringComparison.Ordinal));
Console.WriteLine(foo.EndsWith('\0'));
éèŠ
Windows äžã® ICU ããŒãã«ã«èšèŒãããŠãã Windows ããŒãžã§ã³ã§å®è¡ãããŠãã .NET 5 以éã§ã¯ãäžèšã®ã¹ããããã¯æ¬¡ãåºåããŸãã
True
True
True
False
False
ãã®åäœãåé¿ããã«ã¯ãchar ãã©ã¡ãŒã¿ãŒã®ãªãŒããŒããŒããŸã㯠StringComparison.Ordinal ã䜿çšããŸãã
ã¹ããªã³ã°.ã¹ã¿ãŒãã¹ãŠã£ãº
const string foo = "abc";
Console.WriteLine(foo.StartsWith("\0"));
Console.WriteLine(foo.StartsWith("a"));
Console.WriteLine(foo.StartsWith("\0", StringComparison.CurrentCulture));
Console.WriteLine(foo.StartsWith("\0", StringComparison.Ordinal));
Console.WriteLine(foo.StartsWith('\0'));
éèŠ
Windows äžã® ICU ããŒãã«ã«èšèŒãããŠãã Windows ããŒãžã§ã³ã§å®è¡ãããŠãã .NET 5 以éã§ã¯ãäžèšã®ã¹ããããã¯æ¬¡ãåºåããŸãã
True
True
True
False
False
ãã®åäœãåé¿ããã«ã¯ãchar ãã©ã¡ãŒã¿ãŒã®ãªãŒããŒããŒããŸã㯠StringComparison.Ordinal ã䜿çšããŸãã
TimeZoneInfo.FindSystemTimeZoneById
ICU ã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã Windows ã§å®è¡ãããŠããå Žåã§ããTimeZoneInfoIANAã¿ã€ã ãŸãŒã³ ID ã䜿çšããŠã€ã³ã¹ã¿ã³ã¹ãæè»ã«äœæã§ããŸãã åæ§ã«ãWindows 以å€ã®ãã©ãããã©ãŒã ã§å®è¡ããŠããå Žåã§ããWindows ã¿ã€ã ãŸãŒã³ ID ã䜿çšã㊠TimeZoneInfo ã€ã³ã¹ã¿ã³ã¹ãäœæã§ããŸãã ãã ãããã®æ©èœã¯ NLS ã¢ãŒããŸãã¯ã°ããŒããªãŒãŒã·ã§ã³ ã€ã³ããªã¢ã³ã ã¢ãŒãã䜿çšããå Žåã¯ã䜿çšã§ããªãããšã«æ³šæããããšãéèŠã§ãã
ææ¥åã®çç¥åœ¢
DateTimeFormatInfo.GetShortestDayName(DayOfWeek) ã¡ãœããã¯ãæå®ããææ¥ã®æçã®çç¥ãããææ¥åãååŸããŸãã
- Windows ã® .NET Core 3.1 以åã®ããŒãžã§ã³ã§ã¯ããããã®ææ¥ã®çç¥åœ¢ã¯ã"Su" ã®ããã« 2 æåã§æ§æãããŠããŸããã
- .NET 5 以éã®ããŒãžã§ã³ã§ã¯ããããã®ææ¥ã®çç¥åœ¢ã¯ã"S" ãªã©ã® 1 æåã®ã¿ã§æ§æãããŸãã
ICU äŸåã® API
.NET ã§ã¯ãICU ã«äŸåãã API ãå°å ¥ãããŸããã ãããã® API ã¯ãICU ã䜿çšããŠããå Žåã«ã®ã¿æåããŸãã æ¬¡ã«äŸãããã€ã瀺ããŸãã
ICU on Windows ã»ã¯ã·ã§ã³ã®è¡šã«èšèŒãããŠãã Windows ããŒãžã§ã³ã§ã¯ãã¡ã³ã·ã§ã³ãããŠãã API ã¯æåããŸãã ãã ããå€ãããŒãžã§ã³ã® Windows ã§ã¯ããããã® API ã¯å€±æããŸãã ãã®ãããªå Žåã¯ãã¢ããªããŒã«ã« ICU æ©èœãæå¹ã«ããŠããããã® API ã確å®ã«æåãããããšãã§ããŸãã Windows 以å€ã®ãã©ãããã©ãŒã ã§ã¯ããããã® API ã¯ããŒãžã§ã³ã«é¢ä¿ãªãåžžã«æåããŸãã
ããã«ããããã® API ã®æåãä¿èšŒããããã«ã¯ãã¢ããªãã°ããŒããªãŒãŒã·ã§ã³ ã€ã³ããªã¢ã³ã ã¢ãŒããŸã㯠NLS ã¢ãŒãã§å®è¡ãããŠããªãããšã確èªããããšãéèŠã§ãã
ICU ã®ä»£ããã« NLS ã䜿çšãã
NLS ã®ä»£ããã« ICU ã䜿çšãããšãäžéšã®ã°ããŒããªãŒãŒã·ã§ã³é¢é£ã®æäœã§åäœãéã£ãŠããŸãããšããããŸãã NLS ã䜿çšããããã«å ã«æ»ãã«ã¯ãICU å®è£ ããªããã¢ãŠãã§ããŸãã ã¢ããªã±ãŒã·ã§ã³ã§ã¯ã次ã®ããããã®æ¹æ³ã§ NLS ã¢ãŒããæå¹ã«ã§ããŸãã
ãããžã§ã¯ã ãã¡ã€ã«ã§æ¬¡ãå®è¡ããŸãã
<ItemGroup> <RuntimeHostConfigurationOption Include="System.Globalization.UseNls" Value="true" /> </ItemGroup>runtimeconfig.jsonãã¡ã€ã«ã§æ¬¡ã®æäœãè¡ããŸãã{ "runtimeOptions": { "configProperties": { "System.Globalization.UseNls": true } } }ç°å¢å€æ°
DOTNET_SYSTEM_GLOBALIZATION_USENLSã®å€ãtrueãŸãã¯1ã«èšå®ããŸãã
泚
.NET 9 以éã®ããŒãžã§ã³ã§ã¯ãç°å¢å€æ°ã®èšå®ãåªå
ãããŸãã 以åã®ããŒãžã§ã³ã§ã¯ããããžã§ã¯ããŸã㯠runtimeconfig.json ãã¡ã€ã«ã§èšå®ãããå€ãç°å¢å€æ°ãããåªå
ãããŸãã
詳现ã«ã€ããŠã¯ãã©ã³ã¿ã€ã ã®æ§æèšå®ã«é¢ããããŒãžãåç §ããŠãã ããã
ã¢ããªã§ ICU ã䜿çšãããã©ããã確èªãã
次ã®ã³ãŒã ã¹ããããã¯ãã¢ããªã (NLS ã§ã¯ãªã) ICU ã©ã€ãã©ãªã䜿çšããŠå®è¡ãããŠãããã©ããã倿ããã®ã«åœ¹ç«ã¡ãŸãã
public static bool ICUMode()
{
SortVersion sortVersion = CultureInfo.InvariantCulture.CompareInfo.Version;
byte[] bytes = sortVersion.SortId.ToByteArray();
int version = bytes[3] << 24 | bytes[2] << 16 | bytes[1] << 8 | bytes[0];
return version != 0 && version == sortVersion.FullVersion;
}
.NET ã®ããŒãžã§ã³ã調ã¹ãã«ã¯ãRuntimeInformation.FrameworkDescription ã䜿çšããŸãã
ã¢ããªããŒã«ã« ICU
ICU ã®åãªãªãŒã¹ã«ã¯ããã°ä¿®æ£ãšãäžçã®èšèªãèšè¿°ãããæŽæ°ãããå ±éãã±ãŒã« ããŒã¿ ãªããžã㪠(CLDR) ããŒã¿ãå«ãŸããå ŽåããããŸãã ICU ã®ããŒãžã§ã³ãå€ãããšãã°ããŒããªãŒãŒã·ã§ã³é¢é£ã®æäœã§ã¢ããªã®åäœããããã«åœ±é¿ãåããå ŽåããããŸãã ã¢ããªã±ãŒã·ã§ã³éçºè ããã¹ãŠã®å±éã«ããã£ãŠæŽåæ§ã確ä¿ã§ããããã«ã.NET 5 以éã®ããŒãžã§ã³ã§ã¯ãWindows ãš Unix ã®äž¡æ¹ã®ã¢ããªããç¬èªã® ICU ã®ã³ããŒãå®è¡ããã³äœ¿çšã§ããããã«ãªã£ãŠããŸãã
ã¢ããªã±ãŒã·ã§ã³ã¯ã次ã®ããããã®æ¹æ³ã§ãã¢ããªããŒã«ã« ICU å®è£ ã¢ãŒãã«ãªããã€ã³ã§ããŸãã
ãããžã§ã¯ã ãã¡ã€ã«ã§ã次ã®ããã«é©åãª
RuntimeHostConfigurationOptionå€ãèšå®ããŸãã<ItemGroup> <RuntimeHostConfigurationOption Include="System.Globalization.AppLocalIcu" Value="<suffix>:<version> or <version>" /> </ItemGroup>ãŸãã¯ãruntimeconfig.json ãã¡ã€ã«ã§ã次ã®ããã«é©åãª
runtimeOptions.configPropertieså€ãèšå®ããŸãã{ "runtimeOptions": { "configProperties": { "System.Globalization.AppLocalIcu": "<suffix>:<version> or <version>" } } }ãŸãã¯ãç°å¢å€æ°
DOTNET_SYSTEM_GLOBALIZATION_APPLOCALICUã®å€ã<suffix>:<version>ãŸãã¯<version>ã«èšå®ããŸãã<suffix>: å ¬éãããŠãã ICU ããã±ãŒãžèŠåã«åŸã£ããé·ãã 36 æåæªæºã®çç¥å¯èœãªãµãã£ãã¯ã¹ã ICU ãã«ã¹ã¿ãã€ãºããŠæ§ç¯ããå Žåãlibicuucmyappã®ããã«ãã©ã€ãã©ãªåãšãšã¯ã¹ããŒããããã·ã³ãã«åã«ãµãã£ãã¯ã¹ãå«ãŸããããã«ã«ã¹ã¿ãã€ãºã§ããŸããããã§ã¯ãmyappããµãã£ãã¯ã¹ã§ãã<version>:67.1 ãªã©ã®æå¹ãª ICU ã®ããŒãžã§ã³ã ãã®ããŒãžã§ã³ã¯ããã€ããªãèªã¿èŸŒã¿ããšã¯ã¹ããŒããããã·ã³ãã«ãååŸããããã«äœ¿çšãããŸãã
ãããã®ãªãã·ã§ã³ã®ãããããèšå®ãããŠããå Žåã ã®æ§æã«å¯Ÿå¿ãã PackageReferenceversion ããããžã§ã¯ãã«è¿œå ã§ããããã ãã§ååã§ãã
代ããã«ã.NET ã¯ã¢ããªããŒã«ã« ã¹ã€ãããèšå®ãããŠããå Žåã« ICU ãèªã¿èŸŒãããã« NativeLibrary.TryLoad ã¡ãœããã䜿çšããããã¯è€æ°ã®ãã¹ããããŒãããŸãã ãã®ã¡ãœããã§ã¯ããŸã NATIVE_DLL_SEARCH_DIRECTORIES ããããã£ããã©ã€ãã©ãªãæ€çŽ¢ãããŸãããã®ããããã£ã¯ãã¢ããªã® deps.json ãã¡ã€ã«ã«åºã¥ã dotnet ãã¹ããäœæããŸãã 詳现ã«ã€ããŠã¯ããæ¢å®ã®ãããŒãããåç
§ããŠãã ããã
èªå·±å®çµåã¢ããªã®å Žåã¯ãICU ãã¢ããªã®ãã£ã¬ã¯ããªå
ã«ããããšã確èªãã以å€ã«ããŠãŒã¶ãŒãç¹å¥ã«è¡ãæäœã¯ãããŸãã (èªå·±å®çµåã¢ããªã®å Žåãæ¢å®ã®äœæ¥ãã£ã¬ã¯ããªã¯ NATIVE_DLL_SEARCH_DIRECTORIES ã§ã)ã
NuGet ããã±ãŒãžã® ICU ã䜿çšããŠããå Žåã¯ããã¬ãŒã ã¯ãŒã¯ã«äŸåããã¢ããªã±ãŒã·ã§ã³ã§ãã®ããã«ãªããŸãã NuGet ã¯ãã€ãã£ãè³ç£ã解決ããdeps.json ãã¡ã€ã«ãš runtimes ãã£ã¬ã¯ããªäžã®ã¢ããªã±ãŒã·ã§ã³ã®åºåãã£ã¬ã¯ããªã«ãããæ ŒçŽããŸãã .NET ã¯ãããããããèªã¿èŸŒã¿ãŸãã
ããŒã«ã« ãã«ããã ICU ã䜿çšããããã¬ãŒã ã¯ãŒã¯äŸåã® (èªå·±å®çµã§ãªã) ã¢ããªã®å Žåã¯ã远å ã®æé ãå®è¡ããå¿
èŠããããŸãã .NET SDK ã«ã¯ã"ã«ãŒã¹" ãã€ãã£ã ãã€ããªã deps.json ã«çµã¿èŸŒãæ©èœããŸã ãããŸãã (ãã® SDK ã®åé¡ãåç
§ããŠãã ãã)ã 代ããã«ãã¢ããªã±ãŒã·ã§ã³ã®ãããžã§ã¯ã ãã¡ã€ã«ã«æ
å ±ã远å ããŠæå¹ã«ããããšãã§ããŸãã æ¬¡ã«äŸã瀺ããŸãã
<ItemGroup>
<IcuAssemblies Include="icu\*.so*" />
<RuntimeTargetsCopyLocalItems Include="@(IcuAssemblies)" AssetType="native" CopyLocal="true"
DestinationSubDirectory="runtimes/linux-x64/native/" DestinationSubPath="%(FileName)%(Extension)"
RuntimeIdentifier="linux-x64" NuGetPackageId="System.Private.Runtime.UnicodeData" />
</ItemGroup>
ããã¯ããµããŒããããŠããã©ã³ã¿ã€ã ã®ãã¹ãŠã® ICU ãã€ããªã«å¯ŸããŠå®è¡ããå¿
èŠããããŸãã ãŸããNuGetPackageId é
ç®ã°ã«ãŒãã® RuntimeTargetsCopyLocalItems ã¡ã¿ããŒã¿ãããããžã§ã¯ããå®éã«åç
§ãã NuGet ããã±ãŒãžãšäžèŽããŠããå¿
èŠããããŸãã
Linux ã§ç¹å®ã® ICU ããŒãžã§ã³ãèªã¿èŸŒã
æ¢å®ã§ã¯ãLinux ã§ ICU ã䜿çšãããšãã«ã.NET ã¯ãã€ã³ã¹ããŒã«ãããŠããææ°ããŒãžã§ã³ã® ICU ãã·ã¹ãã ããèªã¿èŸŒãããšããŸãã ãã ããDOTNET_ICU_VERSION_OVERRIDE ç°å¢å€æ°ãèšå®ããããšã§ãç¹å®ã®ããŒãžã§ã³ã® ICU ãèªã¿èŸŒãããã«æå®ã§ããŸãã
ããšãã°ãç°å¢å€æ°ãç¹å®ã®ããŒãžã§ã³çªå· (67.1ãªã©) ã«èšå®ãããšã.NET ã¯ãã®ããŒãžã§ã³ã® ICU ã®èªã¿èŸŒã¿ã詊ã¿ãŸãã ããšãã°ã.NET 㯠libicuuc.so.67.1 ã©ã€ãã©ãªãš libicui18n.so.67.1ã©ã€ãã©ãªãæ€çŽ¢ããŸãã
泚
ãã®ç°å¢å€æ°ã¯ãMicrosoft ãæäŸãã .NET ãã«ãã§ã®ã¿ãµããŒããããLinux ãã£ã¹ããªãã¥ãŒã·ã§ã³ã«ãã£ãŠæäŸããããã«ãã§ã¯ãµããŒããããŸããã
.NET 10 ããåã®ããŒãžã§ã³ã® .NET ã®å Žåããã®ç°å¢å€æ°ã¯ CLR_ICU_VERSION_OVERRIDE ãšåŒã°ããŸãã
æå®ãããããŒãžã§ã³ãèŠã€ãããªãå Žåã.NET ã¯ä»£ããã«ãã€ã³ã¹ããŒã«ãããŠããæã倧ãã ICU ããŒãžã§ã³ãã·ã¹ãã ããèªã¿èŸŒã¿ãŸãã
ãã®æ§æã«ãããICU ããŒãžã§ã³ã®äœ¿çšãæè»ã«å¶åŸ¡ã§ããã¢ããªã±ãŒã·ã§ã³åºæãŸãã¯ã·ã¹ãã æäŸã® ICU ããŒãžã§ã³ãšã®äºææ§ã確ä¿ãããŸãã
macOS ã®åäœ
macOS ã Mach-O ãã¡ã€ã«ã§æå®ããèªã¿èŸŒã¿ã³ãã³ãããäŸåããŠãããã€ããã㯠ã©ã€ãã©ãªã解決ããåäœã¯ãLinux ããŒããŒã®åäœãšã¯ç°ãªããŸãã Linux ããŒããŒã§ã¯ãICU äŸåé¢ä¿ã°ã©ãã«åŸãã.NET ã libicudataãlibicuucãããã³ libicui18n ã (ãã®é åºã§) 詊è¡ããŸãã ãã ãããã㯠macOS ã§ã¯æ©èœããŸããã macOS ã§ ICU ãæ§ç¯ããå ŽåããŠãŒã¶ãŒã¯æ¢å®ã§ãããã®èªã¿èŸŒã¿ã³ãã³ãã§ãlibicuuc ã«ãã€ããã㯠ã©ã€ãã©ãªãååŸããŸãã æ¬¡ã®ã¹ããããã«äŸã瀺ããŸãã
~/ % otool -L /Users/santifdezm/repos/icu-build/icu/install/lib/libicuuc.67.1.dylib
/Users/santifdezm/repos/icu-build/icu/install/lib/libicuuc.67.1.dylib:
libicuuc.67.dylib (compatibility version 67.0.0, current version 67.1.0)
libicudata.67.dylib (compatibility version 67.0.0, current version 67.1.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1281.100.1)
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 902.1.0)
ãããã®ã³ãã³ãã§ã¯ãICU ã®ä»ã®ã³ã³ããŒãã³ãã®äŸåã©ã€ãã©ãªã®ååã®ã¿ãåç
§ããŸãã ããŒããŒã¯ãdlopen 衚èšèŠåã«åŸã£ãŠæ€çŽ¢ãå®è¡ããŸãããã®ãšãããããã®ã©ã€ãã©ãªã¯ã·ã¹ãã ãã£ã¬ã¯ããªã«é
眮ãããŠããããLD_LIBRARY_PATH ç°å¢å€æ°ãèšå®ãããŠããããã¢ããªã¬ãã« ãã£ã¬ã¯ããªã« ICU ãããå¿
èŠããããŸãã
LD_LIBRARY_PATH ãèšå®ã§ããªãå ŽåããŸã㯠ICU ãã€ããªãã¢ããªã¬ãã«ã®ãã£ã¬ã¯ããªã«ãªãå¯èœæ§ãããå Žåã¯ãäœæ¥ã远å ã§è¡ãå¿
èŠããããŸãã
ããŒããŒã«ã¯ããã®èªã¿èŸŒã¿ã³ãã³ãã§ãã€ããªãšåããã£ã¬ã¯ããªããããã®äŸåé¢ä¿ãæ€çŽ¢ããããã«æç€ºããã@loader_path ãªã©ã®ãã£ã¬ã¯ãã£ããããã€ããããŸãã ãããå®çŸããæ¹æ³ã¯ 2 ã€ãããŸãã
install_name_tool -change次ã®ã³ãã³ããå®è¡ããŸãã
install_name_tool -change "libicudata.67.dylib" "@loader_path/libicudata.67.dylib" /path/to/libicuuc.67.1.dylib install_name_tool -change "libicudata.67.dylib" "@loader_path/libicudata.67.dylib" /path/to/libicui18n.67.1.dylib install_name_tool -change "libicuuc.67.dylib" "@loader_path/libicuuc.67.dylib" /path/to/libicui18n.67.1.dylib@loader_pathã䜿çšãããã€ã³ã¹ããŒã«åãäœæããããããICU ããããããŸããautoconf (
./runConfigureICU) ãå®è¡ããåã«ããããã®è¡ã次ã®ããã«å€æŽããŸããLD_SONAME = -Wl,-compatibility_version -Wl,$(SO_TARGET_VERSION_MAJOR) -Wl,-current_version -Wl,$(SO_TARGET_VERSION) -install_name @loader_path/$(notdir $(MIDDLE_SO_TARGET))
WebAssembly ã§ã® ICU
WebAssembly ã¯ãŒã¯ããŒãå°çšã® ICU ããŒãžã§ã³ãå©çšã§ããŸãã ãã®ããŒãžã§ã³ã§ã¯ããã¹ã¯ããã ãããã¡ã€ã«ãšã®ã°ããŒããªãŒãŒã·ã§ã³ã®äºææ§ãæäŸãããŸãã ICU ããŒã¿ ãã¡ã€ã«ã®ãµã€ãºã 24 MB ãã 1.4 MB (Brotli ã§å§çž®ããå Žåã¯çŽ 0.3 MB) ã«æžããããããã®ã¯ãŒã¯ããŒãã«ã¯ããã€ãã®å¶éããããŸãã
次㮠API ã¯ãµããŒããããŠããŸããã
- CultureInfo.EnglishName
- CultureInfo.NativeName
- DateTimeFormatInfo.NativeCalendarName
- RegionInfo.NativeName
次㮠API ã¯ãå¶éä»ãã§ãµããŒããããŠããŸãã
- String.Normalize(NormalizationForm) ãš String.IsNormalized(NormalizationForm) ã§ã¯ã䜿çšé »åºŠã®äœã FormKC ãš FormKD 圢åŒã¯ãµããŒããããŠããŸããã
- RegionInfo.CurrencyNativeName ãã㯠RegionInfo.CurrencyEnglishName ãšåãå€ãè¿ãããŸãã
ããã«ããµããŒãããããã±ãŒã«ãå°ãªããªããŸãã ãµããŒããããŠããäžèЧã¯ãdotnet/icu ãªããžããªã§ç¢ºèªã§ããŸãã
.NET ã¢ããªã§ã®ã°ããŒããªãŒãŒã·ã§ã³ã®ã»ããã¢ãã
.NET ã°ããŒããªãŒãŒã·ã§ã³ã®åæåã¯ãé©åãªã°ããŒããªãŒãŒã·ã§ã³ ã©ã€ãã©ãªã®èªã¿èŸŒã¿ãã«ã«ã㣠ããŒã¿ã®èšå®ãã°ããŒããªãŒãŒã·ã§ã³èšå®ã®æ§æãå«ãè€éãªããã»ã¹ã§ãã ãã以éã®ã»ã¯ã·ã§ã³ã§ã¯ãã°ããŒããªãŒãŒã·ã§ã³ã®åæåãããŸããŸãªãã©ãããã©ãŒã ã§ã©ã®ããã«æ©èœãããã«ã€ããŠèª¬æããŸãã
ãŠã£ã³ããŠãº
Windows ã§ã¯ã.NET ã¯æ¬¡ã®æé ã«åŸã£ãŠã°ããŒããªãŒãŒã·ã§ã³ãåæåããŸãã
ã°ããŒããªãŒãŒã·ã§ã³ ã€ã³ããªã¢ã³ã ã¢ãŒã ãæå¹ã«ãªã£ãŠãããã©ããã確èªããŸãã ãã®ã¢ãŒããã¢ã¯ãã£ããªå Žåã.NET 㯠ICU ã©ã€ãã©ãªã®èªã¿èŸŒã¿ããã€ãã¹ããNLS API ã®äœ¿çšãåé¿ããŸãã ãã®ä»£ããã«ãçµã¿èŸŒã¿ã®ã€ã³ããªã¢ã³ã ã«ã«ã㣠ããŒã¿ã«äŸåãããããåäœã¯ãªãã¬ãŒãã£ã³ã° ã·ã¹ãã ãš ICU ã©ã€ãã©ãªããå®å šã«ç¬ç«ãããŸãŸã«ãªããŸãã
NLS ã¢ãŒããæå¹ã«ãªã£ãŠãããã©ããã確èªããŸãã æå¹ãªå Žåã.NET 㯠ICU ã©ã€ãã©ãªã®èªã¿èŸŒã¿ãã¹ããããã代ããã«ã°ããŒããªãŒãŒã·ã§ã³ã®ãµããŒãã Windows NLS API ã«äŸåããŸãã
ã¢ããªããŒã«ã« ICU æ©èœãæå¹ã«ãªã£ãŠãããã©ããã確èªããŸãã æå¹ãªå Žåã.NET ã¯ãæå®ãããããŒãžã§ã³ãã©ã€ãã©ãªåã«ä»å ããããšã§ãã¢ããªã±ãŒã·ã§ã³ ãã£ã¬ã¯ããªãã ICU ã©ã€ãã©ãªã®èªã¿èŸŒã¿ã詊ã¿ãŸãã ããšãã°ãããŒãžã§ã³ã 72.1 ã®å Žåã.NET ã¯æåã«
icuuc72.dllãicuin72.dllãšicudt72.dllã®èªã¿èŸŒã¿ã詊ã¿ãŸãã ãããã®ã©ã€ãã©ãªãèªã¿èŸŒããªãå Žåã¯ã次ã«icuuc72.1.dllãicuin72.1.dllãšicudt72.1.dllã®èªã¿èŸŒã¿ã詊ã¿ãŸãã ã©ã®ã©ã€ãã©ãªãèŠã€ãããªãå Žåãããã»ã¹ã¯æ¬¡ã®ãããªãšã©ãŒ ã¡ãã»ãŒãžã§çµäºããŸã:Failed to load app-local ICU: {library name}ãåè¿°ã®ç¶æ ãããããæºããããªãå Žåã.NET ã¯ã·ã¹ãã ãã£ã¬ã¯ããªãã ICU ã©ã€ãã©ãªã®èªã¿èŸŒã¿ã詊ã¿ãŸãã æåã«
icu.dllã®èªã¿èŸŒã¿ã詊ã¿ãŸãã ãã®ã©ã€ãã©ãªã䜿çšã§ããªãå Žåã¯ãã·ã¹ãã ãã£ã¬ã¯ããªããicuuc.dllãšicuin.dllã®èªã¿èŸŒã¿ã詊ã¿ãŸãã ãããã®ã©ã€ãã©ãªã®ããããèŠã€ãããªãå Žåãã©ã³ã¿ã€ã ã¯ä»£ããã«ãã°ããŒããªãŒãŒã·ã§ã³ã®ãµããŒãã« NLS API ã䜿çšããŸãã
泚
NLS API ã¯ãã¹ãŠã® Windows ããŒãžã§ã³ã§åžžã«äœ¿çšã§ããããã.NET ã¯åžžã«ã°ããŒããªãŒãŒã·ã§ã³ã®ãµããŒãã«ãããã䜿çšã§ããŸãã
Linux
- ã°ããŒããªãŒãŒã·ã§ã³ ã€ã³ããªã¢ã³ã ã¢ãŒã ãæå¹ã«ãªã£ãŠãããã©ããã確èªããŸãã ãã®ã¢ãŒããã¢ã¯ãã£ããªå Žåã.NET 㯠ICU ã©ã€ãã©ãªã®èªã¿èŸŒã¿ããã€ãã¹ããŸãã ãã®ä»£ããã«ãçµã¿èŸŒã¿ã®ã€ã³ããªã¢ã³ã ã«ã«ã㣠ããŒã¿ã«äŸåãããããåäœã¯ãªãã¬ãŒãã£ã³ã° ã·ã¹ãã ãš ICU ã©ã€ãã©ãªããå®å šã«ç¬ç«ãããŸãŸã«ãªããŸãã
-
ã¢ããªããŒã«ã« ICU æ©èœãæå¹ã«ãªã£ãŠãããã©ããã確èªããŸãã æå¹ãªå Žåã.NET ã¯ãæå®ãããããŒãžã§ã³ãã©ã€ãã©ãªåã«ä»å ããããšã§ãã¢ããªã±ãŒã·ã§ã³ ãã£ã¬ã¯ããªãã ICU ã©ã€ãã©ãªã®èªã¿èŸŒã¿ã詊ã¿ãŸãã ããšãã°ãããŒãžã§ã³ã 68.2.0.9 ã®å Žåã.NET ã¯
libicuuc.so.68.2.0.9ãšlibicui18n.so.68.2.0.9ã®èªã¿èŸŒã¿ã詊ã¿ãŸãã ã©ã®ã©ã€ãã©ãªãèŠã€ãããªãå Žåãããã»ã¹ã¯æ¬¡ã®ãããªãšã©ãŒ ã¡ãã»ãŒãžã§çµäºããŸã:Failed to load app-local ICU: {library name}ã -
DOTNET_ICU_VERSION_OVERRIDEç°å¢å€æ°ãèšå®ãããŠãããã©ããã確èªããŸãã ãã®å Žåã¯ã.NET ã¯ããLinuxã§ç¹å®ã® ICU ããŒãžã§ã³ãèªã¿èŸŒããã«èšèŒãããŠããããã«ãæå®ããã ICU ã®ããŒãžã§ã³ãèªã¿èŸŒãããšããŸãã - åè¿°ã®ç¶æ
ãããããæºããããªãå Žåã.NET ã¯ãã€ã³ã¹ããŒã«ãããŠããæã倧ããããŒãžã§ã³ã® ICU ã©ã€ãã©ãªãã·ã¹ãã ããèªã¿èŸŒãããšããŸãã .NET ã¯ã©ã€ãã©ãª
libicuuc.so.[version]ãšlibicui18n.so.[version]ã®èªã¿èŸŒã¿ã詊ã¿ãŸãããã®ãšãã[version]ã¯ãã·ã¹ãã ã«ã€ã³ã¹ããŒã«ãããŠããæã倧ããããŒãžã§ã³ã® ICU ã§ãã ãããã®ã©ã€ãã©ãªãèŠã€ãããªãå Žåãããã»ã¹ã¯æ¬¡ã®ãããªãšã©ãŒ ã¡ãã»ãŒãžã§çµäºããŸã:Failed to load system ICU: {library name}ã
macOS
- ã°ããŒããªãŒãŒã·ã§ã³ ã€ã³ããªã¢ã³ã ã¢ãŒã ãæå¹ã«ãªã£ãŠãããã©ããã確èªããŸãã ãã®ã¢ãŒããã¢ã¯ãã£ããªå Žåã.NET 㯠ICU ã©ã€ãã©ãªã®èªã¿èŸŒã¿ããã€ãã¹ããŸãã ãã®ä»£ããã«ãçµã¿èŸŒã¿ã®ã€ã³ããªã¢ã³ã ã«ã«ã㣠ããŒã¿ã«äŸåãããããåäœã¯ãªãã¬ãŒãã£ã³ã° ã·ã¹ãã ãš ICU ã©ã€ãã©ãªããå®å šã«ç¬ç«ãããŸãŸã«ãªããŸãã
-
ã¢ããªããŒã«ã« ICU æ©èœãæå¹ã«ãªã£ãŠãããã©ããã確èªããŸãã æå¹ãªå Žåã.NET ã¯ãæå®ãããããŒãžã§ã³ãã©ã€ãã©ãªåã«ä»å ããããšã§ãã¢ããªã±ãŒã·ã§ã³ ãã£ã¬ã¯ããªãã ICU ã©ã€ãã©ãªã®èªã¿èŸŒã¿ã詊ã¿ãŸãã ããšãã°ãããŒãžã§ã³ã 68.2.0.9 ã®å Žåã.NET ã¯
libicuuc68.2.0.9.dylibãšlibicui18n68.2.0.9.dylibã®èªã¿èŸŒã¿ã詊ã¿ãŸãã ã©ã®ã©ã€ãã©ãªãèŠã€ãããªãå Žåãããã»ã¹ã¯æ¬¡ã®ãããªãšã©ãŒ ã¡ãã»ãŒãžã§çµäºããŸã:Failed to load app-local ICU: {library name}ã - åè¿°ã®ç¶æ ãããããæºããããªãå Žåã.NET ã¯ãmacOS ã®åäœã§èª¬æãããŠããããã«ãã€ã³ã¹ããŒã«ãããŠããããŒãžã§ã³ã® ICU ã©ã€ãã©ãªã®èªã¿èŸŒã¿ã詊ã¿ãŸãã