.NET 5.0์ ์ง์ํ๋๋ก ํจํค์ง๋ฅผ ํ์ฅํ๊ณ ์์ผ๋ฉฐ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ฐ์ํ์ต๋๋ค. ์ฝ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฃผ์ด์ง๋ฉด :
using System;
namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
var actual = "Detail of supported commands\n============\n## Documentation produced for DelegateDecompiler, version 0.28.0 on Thursday, 22 October 2020 16:03\n\r\nThis file documents what linq commands **DelegateDecompiler** supports when\r\nworking with [Entity Framework Core](https://docs.microsoft.com/en-us/ef/core/) (EF).\r\nEF has one of the best implementations for converting Linq `IQueryable<>` commands into database\r\naccess commands, in EF's case T-SQL. Therefore it is a good candidate for using in our tests.\r\n\r\nThis documentation was produced by compaired direct EF Linq queries against the same query implemented\r\nas a DelegateDecompiler's `Computed` properties. This produces a Supported/Not Supported flag\r\non each command type tested. Tests are groups and ordered to try and make finding things\r\neasier.\r\n\r\nSo, if you want to use DelegateDecompiler and are not sure whether the linq command\r\nyou want to use will work then clone this project and write your own tests.\r\n(See [How to add a test](HowToAddMoreTests.md) documentation on how to do this). \r\nIf there is a problem then please fork the repository and add your own tests. \r\nThat will make it much easier to diagnose your issue.\r\n\r\n*Note: The test suite has only recently been set up and has only a handful of tests at the moment.\r\nMore will appear as we move forward.*\r\n\r\n\r\n### Group: Unit Test Group\n#### [My Unit Test1](../TestGroup01UnitTestGroup/Test01MyUnitTest1):\n- Supported\n * Good1 (line 1)\n * Good2 (line 2)\n\r\n#### [My Unit Test2](../TestGroup01UnitTestGroup/Test01MyUnitTest2):\n- Supported\n * Good1 (line 1)\n * Good2 (line 2)\n\r\n\r\n\nThe End\n";
var expected = "\n#### [My Unit Test2](";
Console.WriteLine($"actual.Contains(expected): {actual.Contains(expected)}");
Console.WriteLine($"actual.IndexOf(expected): {actual.IndexOf(expected)}");
}
}
}
.NET Core 3.0-> .NET 5.0์ ๋ฐํ์์ ๋ฐ๋ผ ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์ป์ต๋๋ค.
.NET Core 3.0 :
actual.Contains(expected): True
actual.IndexOf(expected): 1475
.NET 5.0 :
actual.Contains(expected): True
actual.IndexOf(expected): -1
Windows 10 Pro ๋น๋ 19041 x64
.NET Core 3.1.9
.NET 5.0.0-rc.2.20475.5
์, .NET Core 3.1.9๋ฅผ ํตํด ์๋ํ์ต๋๋ค.
ํ
์ด ์์ญ์ ๋ํ ๊ตฌ๋
์ ํ๊ทธ ์ง์ : @tarekgh , @safern , @krwq
๊ตฌ๋
ํ๋ ค๋ฉด area-owners.md์ ์ ๋ณด๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
์ด๊ฒ์ .NET 5.0์์ NLS ๋์ ICU๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ ํ ๊ฒ๊ณผ ๊ฐ์ด ์ค๊ณ์ ์ํ ๊ฒ์ ๋๋ค. ์์ธํ ๋ด์ฉ์ https://docs.microsoft.com/en-us/dotnet/standard/globalization-localization/globalization-icu ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
๊ตฌ์ฑ ์ค์์น System.Globalization.UseNls
์ (๋ฅผ) ์ฌ์ฉํ์ฌ ์ด์ ๋์์ผ๋ก ๋๋๋ฆด ์ ์์ง๋ง ICU๊ฐ ๋ ์ ํํ๊ณ ICU๋ฅผ ์ฌ์ฉํ์ฌ ์์ผ๋ก ๋์๊ฐ๋ฉด OS๊ฐ์ ์ผ๊ด์ฑ์ ์ ๊ณตํ๋ฏ๋ก ๊ทธ๋ ๊ฒํ๋ ๊ฒ์ ๊ถ์ฅํ์ง ์์ต๋๋ค.
IndexOf
๋ฅผ) Contains
๋ก ์๋ ์ํค๋ ค๋ฉด ๊ทธ ๋ ์์ ๋น๊ต๋ฅผ ์ฌ์ฉํด์ผํฉ๋๋ค.
C#
actual.IndexOf(expected, StringComparison.Ordinal)
๊ตฌ์ฑ ์ค์์น System.Globalization.UseNls๋ฅผ ์ฌ์ฉํ์ฌ ์ด์ ๋์์ผ๋ก ๋์๊ฐ ์์๋ ์ต์ ์ด ์์ง๋ง ICU๊ฐ ๋ ์ ํํ๊ณ ICU๋ฅผ ์ฌ์ฉํ์ฌ ์์ผ๋ก ๋์๊ฐ๋ฉด OS๊ฐ์ ์ผ๊ด์ฑ์ ์ ๊ณตํ๋ฏ๋ก ๊ทธ๋ ๊ฒํ๋ ๊ฒ์ ๊ถ์ฅํ์ง ์์ต๋๋ค.
์, netcoreapp3.1
๋ฅผ ๋์์ผ๋กํ๋ Unix์์์ด ์ฝ๋๋ฅผ ์คํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋์์ด ํ์๋ฉ๋๋ค.
santifdezm ๎ฐ DESKTOP-1J7TFMI ๎ฐ ~ ๎ฐ experimental ๎ฑ indexof ๎ฐ $ ๎ฐ /home/santifdezm/experimental/indexof/bin/Debug/netcoreapp3.1/linux-x64/publish/indexof
actual.Contains(expected): True
actual.IndexOf(expected): -1
Ordinal
๋น๊ต์ ํจ๊ป @tarekgh ๋ก ์์ ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค.
santifdezm ๎ฐ DESKTOP-1J7TFMI ๎ฐ ~ ๎ฐ experimental ๎ฑ indexof ๎ฐ $ ๎ฐ /home/santifdezm/experimental/indexof/bin/Debug/net5.0/linux-x64/publish/indexof
actual.Contains(expected): True
actual.IndexOf(expected): 1475
์์ค ๋ฌธ์์ด์ \r\n
๋ฐ \n
๊ฐ ํผํฉ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด ์คํจํ ๊ฒ ๊ฐ์ต๋๋ค. \r\n
์ ๋ชจ๋ ์ธ์คํด์ค๋ฅผ \n
๋ก ๋ฐ๊พธ๋ฉด ์๋ํฉ๋๋ค. ๋ด๊ฐ ๋ชจ๋ ๊ฒ์ \r\n
๋ง๋ค ๊ฒฝ์ฐ์๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค. ICU์ ๋น๊ต์์ ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ ์ค๋ ๊ฒ์ ๋จ์ง ํผํฉ์
๋๋ค.
Twitter์๋ณด๊ณ ๋ ๋ฌธ์ ๋ 5.0 ๋ฐํ์ ๋ด ์์ ๋์ผํ ์
๋ ฅ ์ผ๋ก string.IndexOf ํ๋ค๋ ๊ฒ ์
๋๋ค.
https://twitter.com/jbogard/status/1319381273585061890?s=21
ํธ์ง : ์๋ ์คํด์์ต๋๋ค.
@GrabYourPitchforks ๋ฌธ์ ์ ๋ชฉ์ ์ ๋ฐ์ดํธ ํ ์ ์์ต๋๊น? ์ด๊ฒ์ ๊ธฐ์ ์ ์ธ ๋ณ๊ฒฝ ์ฌํญ์ด๋ฏ๋ก Windows ๋ฐ Unix์์ ๋ฐ์ํฉ๋๋ค. ๋ง์ต๋๊น?
์ค๋ช ์ ์ํด Jimmy๋ฅผ ์คํ๋ผ์ธ์ผ๋ก ํํ์ต๋๋ค. ๊ทธ์ ์๋ ๋ฌธ์ ๋ณด๊ณ ์๋ฅผ ์คํดํ์ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค. 280 ์ ํฌ๋ผ์ด ๋ฒ๊ทธ๋ฅผ ๋ช ํํ๊ฒ ์ ๋ฌํ๋ ๋ฐ ํญ์ ํจ์จ์ ์ธ ๊ฒ์ ์๋๋๋ค. ;)
๋ช
ํํํ๊ธฐ ์ํด Contains
API๋ ์์ ์ฐ์ฐ์ ์ํํฉ๋๋ค. ๋ฌธ์์ด ๋น๊ต ํ๋๊ทธ๊ฐ์๋ IndexOf
์ ์ ์๊ฐ ์๋ ์ธ์ด ์ฐ์ฐ์
๋๋ค. ํฌํจ ๋์์ IndexOf์ ๋น๊ตํ๋ ค๋ฉด IndexOf(expected, StringComparison.Ordinal)
๋ฅผ ์ฌ์ฉํด์ผํฉ๋๋ค.
์ฐจ์ด์ ์ ๋ํด ์์ธํ ์์ ๋ณด๋ ค๋ฉด https://docs.microsoft.com/en-us/dotnet/csharp/how-to/compare-strings ๊ฐ ์ ์ฉํ ๋งํฌ์
๋๋ค.
ํธ์ํฐ์์ ํด๋ช
์ ๋ฐ์์ต๋๋ค. ์ฑ์ด ๋ฃจํ์์ IndexOf
๋ฅผ ํธ์ถํ์ง ์์ต๋๋ค. ์ด๊ฒ์ ๋จ์ง ํ์ค 3.0 ๋ 5.0 ํ๋ ์ฐจ์ด ๋ณด๊ณ ์์
๋๋ค.
@GrabYourPitchforks ํธ์ํฐ ํ์ ์ https://docs.microsoft.com/en-us/dotnet/standard/globalization-localization/globalization-icu ๋งํฌ๋ฅผ ๊ณต์ ํ๊ณ ์ด์ ๋์์ผ๋ก ๋์๊ฐ๋ ๊ตฌ์ฑ ์ค์์น๊ฐ ์๋ค๊ณ ์ธ๊ธ ํ ์ ์์ต๋๊น?
ํธ์ํฐ์์ ํด๋ช ์ ๋ฐ์์ต๋๋ค. ์ฑ์ด ๋ฃจํ์์ IndexOf๋ฅผ ํธ์ถํ์ง ์์ต๋๋ค. ์ด๊ฒ์ ๋จ์ง ํ์ค 3.0 ๋ 5.0 ํ๋ ์ฐจ์ด ๋ณด๊ณ ์์ ๋๋ค.
๊ฐ์ฌํฉ๋๋ค, @GrabYourPitchforks ... ์ด๊ฒ์ ๊ธฐ๋ฐ์ผ๋ก ์ค๊ณ์ ๋ฐ๋ผ ๋ซ์ต๋๋ค.
์ฌ๊ธฐ์ ๋ ์ถ๊ฐํ๋ ค๋ฉด NLS๋ก ๋ค์ ์ ํํ์ง ์๊ณ ์ด์ ๋์์ ์ป์ผ๋ ค๋ฉด ๋ค์์ ์ํํ์ญ์์ค.
```C #
CultureInfo.CurrentCulture.CompareInfo.IndexOf (์ค์ , ์์, CompareOptions.IgnoreSymbols)
```C#
actual.IndexOf(expected, StringComparison.Ordinal)
๋์ ์
C#
actual.IndexOf(expected)
์ํ๋ ๋์์ ์ป์ด์ผํฉ๋๋ค.
๋งํฌ ๋ ICU ๊ด๋ จ ๋ฌธ์ (https://docs.microsoft.com/en-us/dotnet/standard/globalization-localization/)์์ \r\n
๋ \n
์ ๋ํ ๋ด์ฉ์ ๋ณผ ์ ์์ต๋๋ค. ์ธ๊ณํ -icu).
์ ๋ง ๊ณํ๋ ๋ณ๊ฒฝ ์ด์์ต๋๊น?
@ForNeVeR ICU์ NLS์ ๋ชจ๋ ์ฐจ์ด์ ์ ๋์ดํ๋ ๊ฒ์ ์ด๋ ค์ธ ๊ฒ์
๋๋ค. ์ด ๋ฌธ์๋ ICU ๋ก์ ์ ํ์ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๋ค. ์์ ์ธ๊ธํ๋ฏ์ด Contains
์ ๊ฒฐ๊ณผ๋ฅผ StringComparison ๋งค๊ฐ ๋ณ์์์ด IndexOf
์ ๋น๊ตํ๋ ๊ฒ์ ์ณ์ง ์์ต๋๋ค. ์ํ๋ ๊ฒฝ์ฐ ์ด์ ๋์์ ์ป์ ์์๋ ๋ช ๊ฐ์ง ๋ฐฉ๋ฒ์ ์์ ๋์ดํ์ต๋๋ค. ์ด ๋ฌธ์ ์ ๋ํ ๋ณด๊ณ ์์์ IndexOf์ ์ฌ์ฉ์ Ordinal ์ต์
์ ์ฌ์ฉํด์ผํ๋ ๊ฒ์ผ๋ก ๋ณด์ด๋ฉฐ ์ด๋ฌํ ๊ฒฝ์ฐ ์ธ์ด ๋น๊ต๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ฌ๋ฐ๋ฅด์ง ์์ต๋๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ ์ธ์ด ๋น๊ต๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค๋ฅธ ํ๊ฒฝ์์ ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณต ํ ์์๋ ํ์ฌ ๋ฌธํ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์์ต๋๋ค.
์ ๋ง ๊ณํ๋ ๋ณ๊ฒฝ ์ด์์ต๋๊น?
์ ICU๋ก ์ ํํ๋ ๊ฒ์ ์ฌ๋ฌ ๊ฐ์ง ์ด์ ๋ก ์๋์ ์ธ ๋ณ๊ฒฝ์ ๋๋ค. Windows๋ ํ์ฌ NLS๋ฅผ ํตํด ICU๋ฅผ ์ฌ์ฉํ์ฌ ์น๊ฒฉํฉ๋๋ค. ICU๋ ์ด์จ๋ ๋ฏธ๋์ ๋๋ค. ๋ํ ICU๋ Windows / Linux / OSX ๋๋ ์ง์๋๋ ๋ชจ๋ ํ๋ซํผ์์ ์ผ๊ด๋ ๋์์ ํ ์์๋ ๊ธฐํ๋ฅผ ์ ๊ณตํฉ๋๋ค. ICU๋ฅผ ์ฌ์ฉํ๋ฉด ์ฑ์ด ์ํ๋ ๊ฒฝ์ฐ ์ธ๊ณํ ๋์์ ์ฌ์ฉ์ ์ ์ ํ ์ ์์ต๋๋ค.
๋ฌธ์์ ํ์๋๋๋ก ์ํ๋ ๊ฒฝ์ฐ ์ด์ ๋์์ผ๋ก ๋ค์ ์ ํ ํ ์์๋ ์ต์ ์ด ์์ต๋๋ค.
์ฐธ์กฐ ๋ ๋ฌธ์์ ๋ฐ๋ฅด๋ฉด Windows์ ICU / NLS ๋์์ ์ค์ ํ๊ฒฝ์ icu.dll
๊ฐ์ฉ์ฑ์ ๋ฐ๋ผ ์๋์ผ๋ก ์ ํ ๋ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๊ฒ์ ๋ ๋
๋ฆฝํ ์ฑ์ ํฐ ๋๋ผ์์ด ๋ ์ ์์ต๋๋ค. ICU๊ฐ ๋ชจ๋ ๋์ ํ๊ฒฝ์์ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฒ์ ์๋๊ธฐ ๋๋ฌธ์ ์ค์์น๊ฐ ๊ฒฐ์ ๋ ๊ฒฝ์ฐ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด .NET์ด ICU๋ฅผ ์ ๊ณต ํ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค. ์ด ์ ํ์ ๋ฐํ์ ์ข
์์ฑ์ ์ํฉ์ ๋์ฑ ์ฌ๋ฏธ์๊ฒ ๋ง๋ญ๋๋ค.
ICU๊ฐ ๋ชจ๋ ๋์ ํ๊ฒฝ์์ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฒ์ ์๋๊ธฐ ๋๋ฌธ์ ์ค์์น๊ฐ ๊ฒฐ์ ๋ ๊ฒฝ์ฐ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด .NET์ด ICU๋ฅผ ์ ๊ณต ํ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค. ์ด ์ ํ์ ๋ฐํ์ ์ข ์์ฑ์ ์ํฉ์ ๋์ฑ ์ฌ๋ฏธ์๊ฒ ๋ง๋ญ๋๋ค.
์ด์ ICU๊ฐ NuGet ํจํค์ง๋ก ๊ฒ์๋ฉ๋๋ค. ์ฑ์ ์ด๋ฌํ ํจํค์ง๋ฅผ ์ฌ์ฉํ์ฌ ์์ฒด ํฌํจ ๋ ์ฑ์ด ICU๋ฅผ ๊ฐ๋๋ก ํ ์ ์์ต๋๋ค. ๋ฌธ์ ์
@tarekgh , ๋๋ Contains
์ IndexOf
์ฌ์ด์ ๋ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ ๊ทธ ์์ฒด๋ก ๋ฌธ์ ๊ฐ ์๋๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค.
๋ฌธ์ ๋ ๋ถ๋ช
ํ IndexOf
๋ก, ๋ค๋ฅธ ASCII ์ ์ฉ ๋ฌธ์์ด ๋ด์์ ํ๋์ ASCII ์ ์ฉ ๋ฌธ์์ด์ ์ฐพ์ ์ ์์ต๋๋ค (ASCII ์ ์ฉ ๋ฌธ์์ด์ ๋ถ๊ณผ ๋ ๋ก์ผ์ผ ์ข
์ ๋์์ด ์๋์ง ํ์คํ์ง ์์ต๋๋ค!).
์ด๊ฒ์ ๋ก์ผ์ผ / NLS / ICU ๊ด๋ จ ๋ณ๊ฒฝ์์ ๊ธฐ๋ํ๋ ๊ฒ์ด ์๋๋๋ค. ์ฌ์ค, ๋ค๋ฅธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด / ๋ฐํ์์ด ๊ทธ๋ ๊ฒ ์๋ํ๋ค๊ณ ์๊ฐํ ์ ์์์ต๋๋ค.
๋ค์์ .NET 5 RC 2์์ ๊นจ์ง ๊ฐ๋จํ ํ ์คํธ ์ผ์ด์ค์ ๋๋ค.
var actual = "\n\r\nTest";
var expected = "\nTest";
Console.WriteLine($"actual.IndexOf(expected): {actual.IndexOf(expected)}"); // => -1
์ ๋ง ๊ทธ๋ ๊ฒ ์๋ํ ๊น์? ๋ํ ์? ์ค์ ๋ก ๋ฌด์์ํ๋ ค๊ณ ํฉ๋๊น?
์ ๋ง ๊ณํ๋ ๋ณ๊ฒฝ ์ด์์ต๋๊น?
์ ICU๋ก ์ ํํ๋ ๊ฒ์ ์ฌ๋ฌ ๊ฐ์ง ์ด์ ๋ก ์๋์ ์ธ ๋ณ๊ฒฝ์ ๋๋ค.
์ฃ์ก ํฉ๋๋ค๋ง ์ด๊ฒ์ด ๊ณํ๋ ๋ณ๊ฒฝ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ๊ทธ๋์ ๊ฐ์กฐํ๊ณ ์ถ์ต๋๋ค. ๋๊ตฌ๋ ๊ทธ๋ฐ ๋ณ๊ฒฝ์ _ ๊ณํ _ํ๋ ๊ฒ์ ์์ํ ์ ์์์ต๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก .NET ํ์ ์ฌ๋๋ค์ด ํจ๊ป ์์ ํ ๋ก ํ์ต๋๋ค.
๋ฌธ์์ด "\ n \ r \ nTest"์ ICU๊ฐ ํ์ฑํ ๋ "\ nTest"๊ฐ ํฌํจ๋์ด ์์ต๋๊น? ์๋, ๋ถ๋ช ํ ๊ทธ๋ ์ง ์์ต๋๋ค!
๊ทธ๋ฆฌ๊ณ ์๋ฌด๋ ๋ถํํ์ง ์์์ต๋๊น? ๊ธฐํ๊ฐ ์๋๋๋ค!
์ด๊ฒ์ ๊ณํ๋๊ฑฐ๋ ์์๋๋ ๋ณ๊ฒฝ์ฒ๋ผ ๋ณด์ด์ง ์๊ณ ๋์ ๋งค์ฐ ์ฌ๊ฐํ ๋ฒ๊ทธ, ํฐ ํธํ์ฑ ์ฐจ๋จ๊ธฐ์ฒ๋ผ ๋ณด์ ๋๋ค. ์ด ๋๋ฌธ์ ์๋กญ๊ณ ์ด์ ๋ .NET ์์ฉ ํ๋ก๊ทธ๋จ์ ์ ๋ฐํ์์์ ์ ๋๋ก ์๋ํ์ง ์์ต๋๋ค. ๋ฌธ์์ด ๋ด๋ถ์์ ํ์ ๋ฌธ์์ด์ ์ฐพ์ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค!
ICU๊ฐ ์ด์ฐจํผ ๋ผ์ธ ์๋ฉ์ ๊ด์ฌ์ด์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ์ผ๋ถ ๋ก์ผ์ผ์๋ ๊ณ ์ ํ ๋ก์ผ์ผ ๋ณ ์ค ๋์ด ์์ต๋๊น?
PS ์, ์์ ํ๋๊ทธ์ ๊ฐ์ด ๋ฌธํ์ ๋
๋ฆฝ์ ์ธ IndexOf
๋ณํ์ ํญ์ ํธ์ถํด์ผํ๋ค๊ณ ์ฃผ์ฅ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ .NET 5์์ ์ด์ฌํ _that_ ๊นฐ ์ ์๋ค๊ณ ๊ฒฐ์ ํ๋ค๋ฉด , ์ ์์ ์ธ ์์ ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉํ๋๋ก ๋ง๋ค ์ ์์ต๋๊น? .NET 5 RC 2์์ ๋ณผ ์์๋ ํ์ฌ ๋ณ๊ฒฝ ์ฌํญ๋ณด๋ค ์์ฉ ํ๋ก๊ทธ๋จ์ด ๋ ์ ๊ฒ ์ค๋จ ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋ํ IndexOf
ํญ์ ๋ฌธํ ๋ณ ๋ฐฉ์์ผ๋ก ์๋ํ์ง๋ง ์์ ํ๋๊ทธ์์ด IndexOf
๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋๊ฐ _tons_ ์กด์ฌํ๋ค๋ ๊ฒ์ ์ดํดํ๊ณ ์์ต๋๋ค. _ ์ผํ๋ ๋ฐ ์ต์ ํจ _ (์ ์ด๋ ์ผ๋ถ / ๋๋ถ๋ถ์ ๊ฒฝ์ฐ). ๊ทธ๋ฆฌ๊ณ .NET 5 ์
๋ฐ์ดํธ ํ ์๋์ด ์ค์ง๋ฉ๋๋ค.
๋ฌธ์ ๋ ๋ค๋ฅธ ASCII ์ ์ฉ ๋ฌธ์์ด ๋ด์์ ํ๋์ ASCII ์ ์ฉ ๋ฌธ์์ด์ ์ฐพ์ ์์๋ IndexOf์ ๋๋ค (ASCII ์ ์ฉ ๋ฌธ์์ด์ ์ ์ฉ๋ ๋ก์ผ์ผ ์ข ์ ๋์์ด ์๋์ง ํ์คํ์ง ์์ต๋๋ค!).
ASCII๋ ๋ก์ผ์ผ ๋ ๋ฆฝ์ ์ ๋๋ค. http://userguide.icu-project.org/collation/concepts ๋งํฌ๋ฅผ ์ฐธ์กฐํ์ญ์์ค. ASCII ๋ฌธ์์ ๋์์ด ๋ฌธํ์ ๋ฐ๋ผ ์ด๋ป๊ฒ ๋ค๋ฅธ์ง ์๋ฅผ ๋ค์ด๋ณด์ญ์์ค.
For example, in the traditional Spanish sorting order, "ch" is considered a single letter. All words that begin with "ch" sort after all other words beginning with "c", but before words starting with "d".
Other examples of contractions are "ch" in Czech, which sorts after "h", and "lj" and "nj" in Croatian and Latin Serbian, which sort after "l" and "n" respectively.
๋ํ ICU๋ ๋ง์ ์ ๋ฌธ๊ฐ๋ค์ด ์ ์๊ฐํ๋ Unicode Standard์์ ๋ฐ์ดํฐ์ ๋์์ ์ ํํ๋ค๋ ์ ์ ๋ถ๋ช
ํํ๊ณ ์ถ์ต๋๋ค. @GrabYourPitchforks ๋ ์ฐ๋ฆฌ๊ฐ ์ฌ๊ธฐ์ ์ด์ผ๊ธฐํ๊ณ ์๋ \r\n\
์ฌ๊ฑด์ ๋ํ ์์ธํ ๋ด์ฉ์ ๊ฒ์ ํ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋ ํํธ, ํนํ ๋ค์์ ์ธ๊ธํ๋ ์น์
์์ https://unicode.org/reports/tr29/ ๋ฌธ์์ ์ต์ํด ์ง ์ ์์ต๋๋ค.
Do not break between a CR and LF. Otherwise, break before and after controls.
--
GB3 | CR | ร | LF
GB4 | (Control \| CR \| LF) | รท | ย
GB5 | ย | รท | (Control \| CR \| LF)
ICU๊ฐ ์ด์ฐจํผ ๋ผ์ธ ์๋ฉ์ ๊ด์ฌ์ด์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ์ผ๋ถ ๋ก์ผ์ผ์๋ ๊ณ ์ ํ ๋ก์ผ์ผ ๋ณ ์ค ๋์ด ์์ต๋๊น?
์ด๊ฒ์ ๋ง์ง๋ง ๋จ๋ฝ์์ ๋ค๋ฃน๋๋ค.
์ฃ์กํ์ง๋ง ์ด๊ฒ์ด ๊ณํ๋ ๋ณ๊ฒฝ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ผ๋ฏ๋ก ๊ฐ์กฐํ๊ณ ์ถ์ต๋๋ค. ๋๊ตฌ๋ ๊ทธ๋ฌํ ๋ณ๊ฒฝ์ ๊ณํํ๋ ๊ฒ์ ์์ํ ์ ์์์ต๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก .NET ํ์ ์ฌ๋๋ค์ด ํจ๊ป ์์ ํ ๋ก ํ์ต๋๋ค.
์ด๊ฒ์ ๊ณํ๋๊ฑฐ๋ ์์๋๋ ๋ณ๊ฒฝ์ฒ๋ผ ๋ณด์ด์ง ์๊ณ ๋์ ๋งค์ฐ ์ฌ๊ฐํ ๋ฒ๊ทธ, ํฐ ํธํ์ฑ ์ฐจ๋จ๊ธฐ์ฒ๋ผ ๋ณด์ ๋๋ค. ์ด ๋๋ฌธ์ ์๋กญ๊ณ ์ด์ ๋ .NET ์์ฉ ํ๋ก๊ทธ๋จ์ ์ ๋ฐํ์์์ ์ ๋๋ก ์๋ํ์ง ์์ต๋๋ค. ๋ฌธ์์ด ๋ด๋ถ์์ ํ์ ๋ฌธ์์ด์ ์ฐพ์ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค!
์ด๊ฒ์ ์ ๊ณํ๋ ์์
์ด๋ฉฐ ๊น์ด ์๊ฐํ์ต๋๋ค. ์ค๋ ์ ์ ๊ฒ์ํ๊ณ ๊ณต๊ฐ์ ์ผ๋ก ๊ณต์ ํ https://github.com/dotnet/runtime/issues/826 ๋ฌธ์ ๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
์ธ๊ณํ ๋์์ .NET๋ฟ๋ง ์๋๋ผ OS ๋ฐ ๊ธฐํ ํ๋ซํผ์์๋ ์ธ์ ๋ ์ง ๋ณ๊ฒฝ ๋ ์ ์์์ ๊ฐ์กฐํ๊ณ ์ถ์ต๋๋ค. ๋ํ ์ฑ์ด ์ฌ์ฉํ๋ ๋์์ด ๋ณ๊ฒฝ๋์ง ์๋๋ก ํน์ ICU ๋ฒ์ ์ ์ฌ์ฉํ ์ ์๋๋ก ICU ์ฑ ๋ก์ปฌ ๊ธฐ๋ฅ์ ์ง์ํ์ต๋๋ค. ๋ ๋ค๋ฅธ ์ฌ์ค์ Windows ์์ฒด๊ฐ ICU๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ณดํ๋ ๊ณผ์ ์ ์์ผ๋ฉฐ ์ธ์ ๊ฐ๋ ICU ๋์์ด ๋๋ถ๋ถ์ ์ฌ์ฉ์๊ฐ ์ฌ์ฉํ๊ฒ ๋ ๊ฒ์
๋๋ค.
์์ ๊น๋ฐ์ฒ๋ผ. ๊ทธ๋ฌ๋ .NET 5์์ ๊ทธ๋ ๊ฒ ์ด๋ ต๊ฒํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค๋ฉด ์ ์์ธ ์์ ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉํ๋๋ก ๋ง๋ค ์ ์์ต๋๊น? .NET 5 RC 2์์ ๋ณผ ์์๋ ํ์ฌ ๋ณ๊ฒฝ ์ฌํญ๋ณด๋ค ์์ฉ ํ๋ก๊ทธ๋จ์ด ๋ ์ ๊ฒ ์ค๋จ ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ค์ ๋ก ์ฐ๋ฆฌ๋ ์ด์ ์ Silverlight ๋ฆด๋ฆฌ์ค ์ค์ ์์ ๋์์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ค์ ํ๋ ค๊ณ ์๋ํ์ผ๋ฉฐ ์ฌ๊ธฐ์๋ณด๊ณ ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ง์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ฐ๋ฐ์๊ฐ IndexOf
์ ๊ฐ์ ๊ฒ์ ํธ์ถ ํ ๋ ์์์ ๊ฐ๊ณ ์๋๋ฅผ ํํํ๊ธฐ ์ํด ์๋์ ์ผ๋ก StringComparison ํ๋๊ทธ๋ฅผ ์ ๊ณต ํ ์ ์๋๋ก ๋ ๋ง์ ๋ฐฉ๋ฒ์ ์ฐพ๊ณ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋น์ ์ด ์๊ฐ ํด๋ผ ์์๋ ๋ชจ๋ ์์ด๋์ด๋ฅผ ํ์ํฉ๋๋ค.
๋ํ IndexOf๊ฐ ํญ์ ๋ฌธํ ๋ณ ๋ฐฉ์์ผ๋ก ์๋ ํจ์๋ ๋ถ๊ตฌํ๊ณ ์์ ํ๋๊ทธ์์ด IndexOf๋ฅผ ์ฌ์ฉํ๋ ์๋ง์ ์ฝ๋๊ฐ ์๊ณ ๊ทธ ์ฝ๋๊ฐ ์๋ํ๋ ๋ฐ ์ฌ์ฉ๋๋ค๋ ๊ฒ์ ๋ชจ๋ ์ดํดํ๋ค๊ณ ์๊ฐํฉ๋๋ค (์ผ๋ถ / ๋๋ถ๋ถ์ ๊ฒฝ์ฐ, ์ ์ด๋). ๊ทธ๋ฆฌ๊ณ .NET 5 ์ ๋ฐ์ดํธ ํ ์๋์ด ์ค์ง๋ฉ๋๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ํ๋ ๊ฒฝ์ฐ ์ด์ ๋์์ผ๋ก ๋ค์ ์ ํ ํ ์์๋ ๊ตฌ์ฑ ์ค์์น๋ฅผ ์ ๊ณตํฉ๋๋ค. System.Globalization.UseNls๋ฅผ ์ดํด๋ณด์ญ์์ค.
@tarekgh , ์ฒ ์ ํ ์ค๋ช ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
์ง๊ธ์์ด ํน์ \r\n
๋์์ ๋ํ ์์ธํ ๋ด์ฉ์ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ด ํน์ ๊ฒ์์ ์ํ ํ ๋ IndexOf
"Grapheme Cluster Boundary Rules"(๊ทธ๋ฆฌ๊ณ ๊ทธ๋ ๊ฒํด์ผํ๋์ง ์ฌ๋ถ)๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ๋ช
ํํ์ง ์์ต๋๋ค.
๋ํ ์ ๋ ์ฝ๋ ์ฌ์์ด ์ฌ๊ธฐ์ ๊ด๋ จ์ด ์๋๋ผ๋ https://unicode.org/reports/tr29/ ๋ฅผ ์ฝ์ด ๋ณด๋ฉด ๋ง์ง๋ง \n
์ ์ผ์นํ๋ ๊ฒ์ด ๊ธ์ง๋์ด ์๋์ง ํ์ ํ ์ ์์ต๋๋ค CR | ร | LF
๋์ด ์๋๋ฐ, ร
๋ "๊ฒฝ๊ณ ์์ (์ฌ๊ธฐ์์ ์ค๋จ์ ํ์ฉํ์ง ์์)"์ ์๋ฏธํฉ๋๋ค. ๋ฐ๋ผ์ ์ํ์ค๋ฅผ ๋์ ๋ \r\n\n
, ์ฒซ ๋ฒ์งธ ๋ฌธ์์ ๋ ๋ฒ์งธ ๋ฌธ์ ์ฌ์ด์ "๋ถ๋ฆฌ"๋ฅผ ๋๋ ๊ฒ๋ง ๊ธ์งํ์ง๋ง ์ธ ๋ฒ์งธ ๋ฌธ์ ์์ "๋ถ๋ฆฌ"๋ฅผ ๋๋ ๊ฒ์ ๊ด์ฐฎ์ต๋๋ค. ๊ทธ๋์ ์ ๋ \r\n\n
๋ฅผ ๋ ๊ฐ์ ๋ถ๋ฆฌ ๋ "๋ฌธ์ ์ ํด๋ฌ์คํฐ"๋ก ์ฝ์์ต๋๋ค. IndexOf
๊ฐ ์ ์ฒด ๋ฌธ์ ์ ํด๋ฌ์คํฐ์ ์ผ์นํด์ผํ๊ณ ํด๋ฌ์คํฐ์ ์ผ๋ถ๋ฅผ ์ ๋ ๊ฑด๋๋ฆฌ์ง ์๋๋ผ๋ ์ฌ์ ํ ํ์ ๋ฌธ์์ด \nTest
์ฐพ์ ์ ์์ต๋๋ค. \n\r\nTest
.
๋ํ ICU ๋ฐ / ๋๋ ์ ๋ ์ฝ๋ ์ฌ์์ ์์กดํ๋ ๋ค๋ฅธ ๋ฐํ์ / ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๊ฐ์ด ํน์ ์์ ์์ ๋์ผํ๊ฒ ์๋ํด์ผํ๋ค๊ณ ๋งํ๊ณ ์์ต๋๊น?
์ฐ๋ฆฌ๋ ๊ฐ๋ฐ์๊ฐ
IndexOf
์ ๊ฐ์ ๊ฒ์ ํธ์ถ ํ ๋ ์์์ ๊ฐ๊ณ ์๋๋ฅผ ํํํ๊ธฐ ์ํด ์๋์ ์ผ๋ก StringComparison ํ๋๊ทธ๋ฅผ ์ ๊ณต ํ ์ ์๋๋ก ๋ ๋ง์ ๋ฐฉ๋ฒ์ ์ฐพ๊ณ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋น์ ์ด ์๊ฐ ํด๋ผ ์์๋ ๋ชจ๋ ์์ด๋์ด๋ฅผ ํ์ํฉ๋๋ค.
_ (ํ์ํ ๋ฉด์ฑ ์กฐํญ : ์ ๋ ReSharper๋ฅผ ํฌํจํ ์ฌ๋ฌ ํ๋ก์ ํธ์์ JetBrains์์ ์ผํฉ๋๋ค.) _
์ฒ์์๋ ๊ด๊ณ ์ฒ๋ผ ๋ค๋ฆฌ์ง ์๊ฒ์ด ์ ์ ์ฌ๊ธฐ์ ๊ฐ์ ธ์ค๊ณ ์ถ์ง ์์์ง๋ง, ์ด๊ฒ์ด ๋งค์ฐ ๊ด๋ จ์ด์๋ ๊ฒ ๊ฐ์์ํด์ผํฉ๋๋ค. ReSharper๋ ๊ธฐ๋ณธ์ ์ผ๋ก IndexOf
ํธ์ถํ๋ ์ฌ์ฉ์ ์ฝ๋์ ๋ํด ๋ค์ ๊ฒฝ๊ณ ๋ฅผ ํ์ํฉ๋๋ค.
_ (์ด ์ค๋ ๋์ ์ฐธ์ฌํ๊ธฐ ์ ์๋์ด ํน์ ReSharper ์ง๋จ์ ๋ํด ์์ง ๋ชปํ๊ธฐ ๋๋ฌธ์์ด ๋ ผ์์ ์ฐธ์ฌ ํ์ง ์์ต๋๋ค. ) _
๋ฐ๋ผ์ ๋ค๋ฅธ ๋ชจ๋ ๋๊ตฌ์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ทธ๋ฌํ ์๋ฆผ์ ํ์ํ๊ฑฐ๋ ๊ทธ๋ฌํ ์๋ฆผ์ผ๋ก์ด ๊ฐ์ง ๋ฐฉ๋ฒ์ ์์ ํ ๋น๋ํ๋ ๊ฒ์ด ๋งค์ฐ ์ข์ ์๊ฐ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋ฟก๋ฟก
๋ํ unicode.org/reports/tr29๋ฅผ ์ฝ์์ ๋ ์ ๋ ์ฝ๋ ์ฌ์์ด ์ฌ๊ธฐ์ ๊ด๋ จ์ด ์๋๋ผ๋ (์์ฃผ ์ ๋ ์ ์์ต๋๋ค!) ๋ง์ง๋ง \ n๊ณผ ์ผ์นํ๋ ๊ฒ์ด ๊ธ์ง๋์ด ์๋์ง ํ์ ํ ์ ์์ต๋๋ค. ์ฌ์์ ์ฝ์ผ๋ฉด์ CR | ร | LF, ์ฌ๊ธฐ์ ร๋ "๊ฒฝ๊ณ ์์ (์ฌ๊ธฐ์๋ ๋๊ธฐ๋ฅผ ํ์ฉํ์ง ์์)"์ ์๋ฏธํฉ๋๋ค. ๋ฐ๋ผ์ ์ํ์ค๋ฅผ ๊นจ๋จ๋ฆด ๋ \ r \ n \ n ์ฒซ ๋ฒ์งธ ๋ฌธ์์ ๋ ๋ฒ์งธ ๋ฌธ์ ์ฌ์ด์ "๋ถ๋ฆฌ"๋ฅผ ๋๋ ๊ฒ๋ง ๊ธ์งํ์ง๋ง ์ธ ๋ฒ์งธ ๋ฌธ์ ์์ "๋ถ๋ฆฌ"๋ฅผ ๋๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ทธ๋์ ์ ๋ \ r \ n \ n ๋ ๊ฐ์ ๋ถ๋ฆฌ ๋ "๋ฌธ์ ์ ํด๋ฌ์คํฐ"๋ก ์ฝ์์ต๋๋ค.
๋ง์์. \r\n\n
๋ \r\n
๋ฐ \n
๋ก 2 ๊ฐ์ ํด๋ฌ์คํฐ๊ฐ๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ IndexOf๊ฐ ์ ์ฒด ์์ ํด๋ฌ์คํฐ์ ์ผ์นํด์ผํ๊ณ ํด๋ฌ์คํฐ์ ์ผ๋ถ๋ฅผ ๋ง์ง์ง ์๋๋ผ๋ ๋ฌธ์์ด \ n \ r \ nTest ๋ด๋ถ์์ ํ์ ๋ฌธ์์ด \ nTest๋ฅผ ์ฐพ์์ผํฉ๋๋ค.
๊ทธ๊ฒ์ ํ ๋ ธ์ต๋๋ค. \n\r\nTest
๋ ๋ถ๋ถ์ผ๋ก ๋๋ฉ๋๋ค. \n
, \r\n
๋ฐ Test
. \nTest
๋์ด ๋ฌธ์์ด์ ์ผ๋ถ๊ฐ ๋ ์ ์์์ด ๋ถ๋ช
ํฉ๋๋ค. ํด๋ฌ์คํฐ๋ฅผ ๋์ฒดํ๋ ๊ทธ๊ฒ์ ๋ํด ์๊ฐ \r\n
๋ช ๊ฐ์ง ๊ธฐํธ X
. ์ด์ ์์ค ๋ฌธ์์ด์ \nXTest
ํฌํจํ์ง ์๋ \nTest
์
๋๋ค.
๋ํ ICU ๋ฐ / ๋๋ ์ ๋ ์ฝ๋ ์ฌ์์ ์์กดํ๋ ๋ค๋ฅธ ๋ฐํ์ / ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๊ฐ์ด ํน์ ์์ ์์ ๋์ผํ๊ฒ ์๋ํด์ผํ๋ค๊ณ ๋งํ๊ณ ์์ต๋๊น?
๊ธฐ๋ณธ ๋ฐ์ดํฐ ์ ๋ ฌ ๊ฐ๋ ์์ค์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋๋ต์ ์์ ๋๋ค. ICU๋ ๊ฒฐ๊ณผ์ ์ํฅ์ ์ค ์์๋ ๊ฐ๋ ์์ค์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์์ ์ธ๊ธํ๋ฏ์ด ๋ค์๊ณผ ๊ฐ์ ์์ ์ ์ํํฉ๋๋ค.
CultureInfo.CurrentCulture.CompareInfo.IndexOf(actual, expected, CompareOptions.IgnoreSymbols)
๊ฐ๋ ์์ค์ ๋ณ๊ฒฝํ๊ณ ์์
์์ ๊ธฐํธ๋ฅผ ๋ฌด์ํ๋๋กํฉ๋๋ค ( \n
๋ฐ \r
์ ํด๋น ์์ ์์ ๋ฌด์๋๋ฏ๋ก ๋ณ๊ฒฝ๋จ).
๋ํ ์์ ICU ๋ค์ดํฐ๋ธ C ์ฑ์ ์์ฑํ๊ณ ๋์ผํ ๊ฒฝ์ฐ๋ฅผ ์คํํ์ต๋๋ค.
void SearchString(const char *target, int32_t targetLength, const char *source, int32_t sourceLength)
{
static UChar usource[100];
static UChar utarget[100];
u_charsToUChars(source, usource, sourceLength);
u_charsToUChars(target, utarget, targetLength);
UErrorCode status = U_ZERO_ERROR;
UStringSearch* pSearcher = usearch_open(utarget, targetLength, usource, sourceLength, "en_US", nullptr, &status);
if (!U_SUCCESS(status))
{
printf("usearch_open failed with %d\n", status);
return;
}
int32_t index = usearch_next(pSearcher, &status);
if (!U_SUCCESS(status))
{
printf("usearch_next failed with %d\n", status);
return;
}
printf("search result = %d\n", index);
usearch_close(pSearcher);
}
int main()
{
SearchString("\nT", 2, "\r\nT", 3);
SearchString("\nT", 2, "\n\nT", 3);
}
์ด ์ฑ์ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
search result = -1
search result = 1
.NET์์ ๋ณผ ์์๋ ๋์๊ณผ ๋์ผํฉ๋๋ค.
์ง๊ธ์์ด ํน์ \ r \ n ๋์์ ๋ํ ์์ธํ ๋ด์ฉ์ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ด ์ข์ต๋๋ค. IndexOf๊ฐ์ด ํน์ ๊ฒ์์ ์ํ ํ ๋ "Grapheme Cluster Boundary Rules"๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ (๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ์ํํด์ผํ๋์ง ์ฌ๋ถ)์ด ๋ช ํํ์ง ์์ต๋๋ค.
ํ์คํ ํด๋ฌ์คํฐ๋ง์ด ๋ฐ์ดํฐ ์ ๋ ฌ ์์ ์ ์ํฅ์ ๋ฏธ์น๊ณ ์์ต๋๋ค. http://unicode.org/reports/tr29/tr29-7.html ์ ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ช ํํ๊ฒ ์ค๋ช ๋์ด ์์ต๋๋ค.
Grapheme clusters include, but are not limited to, combining character sequences such as (g + ยฐ), digraphs such as Slovak โchโ, and sequences with letter modifiers such as kw.
Grapheme ํด๋ฌ์คํฐ ๊ฒฝ๊ณ๋ ๋ฐ์ดํฐ ์ ๋ ฌ์ ์ค์ํฉ๋๋ค. , regular-expressions, and counting โcharacterโ positions within text. Word boundaries, line boundaries and sentence boundaries do not occur within a grapheme cluster. In this section, the Unicode Standard provides a determination of where the default grapheme boundaries fall in a string of characters. This algorithm can be tailored for specific locales or other customizations, which is what is done in providing contracting characters in collation tailoring tables.
๋ ์์ธํ ๋ด์ฉ์ด ์๋์ง ํ์คํ์ง ์์ง๋ง ์ฌ๊ธฐ์ ์ถ๊ฐ ํ ๋ด์ฉ์ด ๋ ์์ผ๋ฉด @GrabYourPitchforks์ ๋๊ธ์ ๋ฌ๊ฒ ์ต๋๋ค.
๋ฐ๋ผ์ ๋ค๋ฅธ ๋ชจ๋ ๋๊ตฌ์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ทธ๋ฌํ ์๋ฆผ์ ํ์ํ๊ฑฐ๋ ๊ทธ๋ฌํ ์๋ฆผ์ผ๋ก์ด ๊ฐ์ง ๋ฐฉ๋ฒ์ ์์ ํ ๋น๋ํ๋ ๊ฒ์ด ๋งค์ฐ ์ข์ ์๊ฐ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๊ฐ์ฌ!
์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์๊ฐํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฐฉํฅ์
๋๋ค.
์ ์์ ์ ์ํด ๋ฒ์ ๊ฐ์ ๋ค์ํ ๊ณผ๋ถํ๋ฅผ ๋น๊ตํ์ต๋๋ค.
| ๋ฐฉ๋ฒ | netcoreapp3.1
| net5.0
|
| ------------------------------------------------- --------------- | ----------------- | ---------- |
| actual.Contains(expected)
| ์ฌ์ค | ์ฌ์ค |
| actual.IndexOf(expected)
| 1475 | -1 |
| actual.Contains(expected, StringComparison.CurrentCulture)
| ์ฌ์ค | ๊ฑฐ์ง |
| actual.IndexOf(expected, StringComparison.CurrentCulture)
| 1475 | -1 |
| actual.Contains(expected, StringComparison.Ordinal)
| ์ฌ์ค | ์ฌ์ค |
| actual.IndexOf(expected, StringComparison.Ordinal)
| 1475 | 1475 |
| actual.Contains(expected, StringComparison.InvariantCulture)
| ์ฌ์ค | ๊ฑฐ์ง |
| actual.IndexOf(expected, StringComparison.InvariantCulture)
| 1475 | -1 |
์ด๋ฅผ ์ํด ๋ถ์๊ธฐ๋ฅผ ํฌํจํ์ญ์์ค.
์ด๊ฒ์ ์ฅ๊ธฐ์ ์ผ๋ก๋ ์ข์ง๋ง .NET 5๊ฐ ์ถ์๋๋ฉด ์์ฒญ๋ ์์ ์ดํ์ ์ผ์ผํค๋ ๋ณ๊ฒฝ ์ฌํญ ์ค ํ๋ ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ๋ฐ๋ผ์ ์ด๋ฌํ ๋ฉ์๋์ ๋์์ด .NET 5์ .NET Core 3.1๊ฐ์ ๋ค๋ฅธ ๊ฒฝ์ฐ .NET 5๊ฐ ์ ๋ฌ ๋ string
๋ฅผ ์กฐ์ํ๋ .NET Standard 2.0 ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ด๋ถ์ ์ ์ ๋ ๊ฐ์ฒด๋ฅผ ํธ์ถ ํ ๋ ์ด๋ค ์ผ์ด ๋ฐ์ํฉ๋๊น? .NET callsite์์? ์ด์ ๋์์ด ์ฌ์ฉ๋ฉ๋๊น ์๋๋ฉด ์๋ก์ด ๋์์ด ์ฌ์ฉ๋ฉ๋๊น?
@Aaronontheweb ์๋ก์ด ํ๋. ์ฒ์์๋ netstandard2.0
๋ฅผ ๋ชฉํ๋กํ๋ NUnit3์ ์ด์ค ์
์์ ์ด๊ฒ์ ๋ณด์์ต๋๋ค. ์
๊ทธ๋ ์ด๋ ํ ๋์ ํ๋ ์ ์ํฌ ๋ง ๋ณ๊ฒฝํ์ ๋ ํ
์คํธ๊ฐ ์คํจํ๊ธฐ ์์ํ์ต๋๋ค.
๊ทธ๊ฒ์ ๋๋จํ์ง ์์ต๋๋ค-๋ด๊ฐ ์ฐธ์กฐํ๋ ์ค๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ ๊ทธ๋ ์ด๋๋ฅผ ์ํ ๋ ์ํํ๋ ์์ ์ ์ ์ด ํ ์ ์์ต๋๋ค.
๋จ์ ํ
์คํธ์์์ด๋ฅผ ๊ฐ์งํ์ง ๋ชปํ๊ณ ํ๋ก๋์
์ ์ ์ฉํ์ง ์๋ ์ฑ์ ๋ช ๊ฐ์
๋๊น?
.NET ํ์ ์ด๋ก ์ธํด ๋ฐ์ํ ์์๋ ๊ณ ํต๊ณผ ๋ฌธ์ ์ ๋ฐ ๋น์ฉ์ ๊ณ ๋ ค ํ์ต๋๊น?
๊ทธ๊ฒ์ ๋๋จํ์ง ์์ต๋๋ค-๋ด๊ฐ ์ฐธ์กฐํ๋ ์ค๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ ๊ทธ๋ ์ด๋๋ฅผ ์ํ ๋ ์ํํ๋ ์์ ์ ์ ์ด ํ ์ ์์ต๋๋ค.
๋ฉ์ง ํจ์ !
์ด์ํ ๋ฒ๋ ๋ฅผ ์ฌ๋ฅํ๋ฉฐ ๋ญ๋นํ๋ ํ๋ณตํ ์๊ฐ ๐
ํ์ง๋ง InvariantGlobalization์ด์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง ๋ชปํ๋ ์ด์ ๋ ๋ฌด์์
๋๊น?
์ด๋ฅผ ์ํด ๋ถ์๊ธฐ๋ฅผ ํฌํจํ์ญ์์ค.
๋ค. ๊ทธ๋ฆฌ๊ณ F # ์ง์์ ์์ง ๋ง์ธ์.
๋จ์ ํ ์คํธ์์ ๊ฐ์งํ์ง ๋ชปํ๋ ์ฑ ์
0-๋จ์ ํ ์คํธ๋ .NET BCL ์์ฒด์ ๊ฐ์ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ / ํ๋ ์ ์ํฌ๋ฅผ ํ ์คํธํ๊ธฐ์ํ ๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ด ๊ฒฌํด๋์ด ๋์ ๋ณ๊ฒฝ ๋ชจ๋๋ฅผ ์ ์ด ํ ์์๋ ์ด์ ๋ธ๋ฆฌ ๋ ๋ฒจ ์์ฑ์ด ์์ด์ผํ๋ค๋ ๊ฒ์ ๋๋ค. ์ต์ํ ์ด์ ๋ธ๋ฆฌ ๋ณ ์์ค์์ ์ตํธ ์ธ / ์ตํธ ์ธ ํ ์ ์์ต๋๋ค. ์ด๊ฒ์ .NET Standard ๋ฌธ์ ๋ ์ฌ๋ผ์ง์ ์๋ฏธํฉ๋๋ค.
๊ทธ๊ฒ์ ๋๋จํ์ง ์์ต๋๋ค-๋ด๊ฐ ์ฐธ์กฐํ๋ ์ค๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ ๊ทธ๋ ์ด๋๋ฅผ ์ํ ๋ ์ํํ๋ ์์ ์ ์ ์ด ํ ์ ์์ต๋๋ค.
์ ๋น์ ์ด ๊ทธ๊ฒ์ ํต์ ํ ์ ์๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋ชจ๋ ๋ฌธ์์ด ๋น๊ต๋ ICU ๋๋ NLS๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ํ๋ ๊ฒฝ์ฐ compat ์ค์์น๋ฅผ ์ฌ์ฉ
์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์์ ์ ์ผ๋ก ์ ์ง๋๋ ์ธ๊ณํ ๋ฐ์ดํฐ์ ์์กด ํ ์ ์์ต๋๋ค. ์์ ์ ์ธ ์ธ๊ณํ ๋ฐ์ดํฐ์ ์์กดํ๋ ์ฌ๋๋ค์ ๋ง๊ฐ ๋จ๋ฆฌ๋ ๊ฒ์ ๋๋ ค์ํ์ง ์๋๋ค๋ Windows ํ์ ์๊ฒฌ์ ๋ค์ด๋ณด์ญ์์ค. ์ธ๊ณํ ๊ธฐ๋ฅ์ ๋ธ๋ ๋ฐ์ค ์ฌ์ผํฉ๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ (ํนํ .NET Standard๋ฅผ ๋์์ผ๋กํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ)๊ฐ ์ด์ ๊ฐ์ ๊ตฌํ ์ธ๋ถ ์ฌํญ์ ์์กดํ๋ค๊ณ ๋งํ๋ ๊ฒ์ ์ด์น์ ๋ง์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ง์ ์ฌ๋๋ค์ด Windows์ Linux์์ ์๋ก ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ .NET ์ธ๊ณํ ๊ธฐ๋ฅ์ ๋ํด ๋ถํ ํ ๊ฒ์ฒ๋ผ ํ์ ํฉ๋๋ค. Windows์ ๋ค๋ฅธ ํ๋ซํผ ๊ฐ์ ๋์์ ํตํฉํ๋ ๊ฒ์ด ๋ ๋ซ์ต๋๋ค. ์ฌ๋ฐ๋ฅธ ์ฝ๋๋ ์ธ๊ณํ ๋ฐ์ดํฐ๊ฐ ๋ถ๋ณ์ ์์กดํด์๋ ์๋ฉ๋๋ค.
StringComparison.Ordinal
๋ ๊ธฐ๋ณธ ๋น๊ต ์ ๋ต์ผ๋ก ๋ง๋ค๊ธฐ ์ํด ๋ธ๋ ์ดํน ์ฒด์ธ์ง๋ฅผ ๊ณ ๋ ค ํ์๊ฒ ์ต๋๊น? ์ธ๊ณํ๊ฐ ๋งค์ฐ ๋ถ์์ ํ๊ธฐ ๋๋ฌธ์ ์ ์ด๋ ๊ธฐ๋ณธ ๊ตฌํ์ด ์์ ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ ๋์ ์ฌ์ฉํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์
๋๋ค. string.Equals(...)
๋๋ string.Contains(...)
๋ฑ์ ์ฌ์ฉํ๋ ์ฌ๋๋ค ์ค StringComparison
๋ฅผ ํต๊ณผํ์ง ์๊ณ ์ฌ์ฉํ๋ 99.9 %์ ์ฌ๋๋ค์ด ๋ก์ผ์ผ.
ํธ์ง : ๋ด ์ง๋ฌธ์ ์ด๋ฏธ ๋ต๋ณ ๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ค์ ๋ก ์ฐ๋ฆฌ๋ ์ด์ ์ Silverlight ๋ฆด๋ฆฌ์ค ์ค์ ์์ ๋์์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ค์ ํ๋ ค๊ณ ์๋ํ์ผ๋ฉฐ ์ฌ๊ธฐ์๋ณด๊ณ ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ง์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ฐ๋ฐ์๊ฐ IndexOf์ ๊ฐ์ ๊ฒ์ ํธ์ถ ํ ๋ ์์์ ๊ฐ๊ณ ์๋๋ฅผ ํํํ๊ธฐ ์ํด ์๋์ ์ผ๋ก StringComparison ํ๋๊ทธ๋ฅผ ์ ๊ณต ํ ์ ์๋๋ก ๋ ๋ง์ ๋ฐฉ๋ฒ์ ์ฐพ๊ณ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋น์ ์ด ์๊ฐ ํด๋ผ ์์๋ ๋ชจ๋ ์์ด๋์ด๋ฅผ ํ์ํฉ๋๋ค.
์ํ๋ ๊ฒฝ์ฐ compat ์ค์์น๋ฅผ ์ฌ์ฉํ์ฌ ICU๋ฅผ ์ตํธ ์์ ํ ์ ์์ผ๋ฉฐ ๋ชจ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ด์ ๋์์ผ๋ก ๋๋์๊ฐ๋๋ค.
์ ๋ ์์ฉ ํ๋ก๊ทธ๋จ์ด ์๋ ์๊ณ๋ฅผ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ญ๋๋ค. ๋๋ ์ด๊ฒ์ ์ฒ๋ฆฌํ๋ ์ปดํ์ผ ํ์ ๋ฐฉ๋ฒ์ ์ ํธํฉ๋๋ค.
์ฐ๋ฆฌ๊ฐํ๋ ๋๋ถ๋ถ์ ์์
์ InvariantCulture
์ด๋ฉฐ, ์ ๊ฐ ์ด์ ์ ์ดํด ํ ๋ฐ์ ๋ฐ๋ฅด๋ฉด ์ค๊ณ ์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ํฉ์์๋ IndexOf
์ ๋์์ด .NET 5.0๊ณผ .NET Core 3.1๊ฐ์ ๋ค๋ฅธ ๊ฒ ๊ฐ์ต๋๋ค.
๋ถ์๊ธฐ๊ฐ ๊ธฐ์กด ํ๋ก์ ํธ์ ์ด๋ค ๋์์ ์ค ์ ์์ต๋๊น?
@petarrepac ๋ C # ์ ์ฉ์ ๋๋ค.
@isaacabraham ๊ณผ VB๋;)
๋๋ ์ด๊ฒ์ ์ฒ๋ฆฌํ๋ ์ปดํ์ผ ํ์ ๋ฐฉ๋ฒ์ ์ ํธํฉ๋๋ค.
@Aaronontheweb ๋น์ ์ ์ด๊ฒ์ ์ฒ๋ฆฌํ๋ ์ปดํ์ผ ํ์ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค (์ฑ์ ์ปดํ์ผ ํ ๋). ์ด๊ฒ์ ํ๋ก์ ํธ์ ์ถ๊ฐ ํ ์ ์์ต๋๋ค.
<ItemGroup>
<RuntimeHostConfigurationOption Include="System.Globalization.UseNls" Value="true" />
</ItemGroup>
ํธ์ง : ์ด๊ฒ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ์ฑ์๋ง ํด๋น๋๋ฉฐ, ๋ถํํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ฑํ ๋์ด๋ฅผ ์ ์ด ํ ์ ์์ต๋๋ค.
์ฅ๊ธฐ์ ์ผ๋ก Windows ํ์ ICU ๋ก์ ์ด์ ์ ์ถ์งํ๊ณ ์์ผ๋ฏ๋ก ์ด๋ ์์ ์์ ICU๋ ์ธ๊ณํ ์คํ ๋ฆฌ๊ฐ ๋ ๊ฒ์ด๋ฉฐ ์ฐ๋ฆฌ๋ OS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋๋ฌ์ผ ์์ ๋ํผ ์ผ๋ฟ์ ๋๋ค.
.NET 5๊ฐ .NET ํธ์ถ ์ฌ์ดํธ์์ ์ ๋ฌ ๋ ๋ฌธ์์ด์ ์กฐ์ํ๋ .NET Standard 2.0 ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ด๋ถ์ ์ ์ ๋ ๊ฐ์ฒด๋ฅผ ํธ์ถํ๋ฉด ์ด๋ป๊ฒ๋ฉ๋๊น? ์ด์ ๋์์ด ์ฌ์ฉ๋ฉ๋๊น ์๋๋ฉด ์๋ก์ด ๋์์ด ์ฌ์ฉ๋ฉ๋๊น?
์๋ก์ด ๋์์ ๋ฐํ์์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ฉฐ .NET Standard๋ ๋ฐํ์์ ๊ตฌํํ๊ธฐ์ํ ํ์ค ์ผ ๋ฟ์ด๋ฏ๋ก ์ฌ์ฉ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ด Unix์ Windows๊ฐ์ ํ๋ซํผ ์ผ๊ด์ฑ์ ๊ฐ์ ธ์ค๊ณ ์๋ค๋ ์ ์ ์ ์ํ์ญ์์ค. ์ฌ๋๋ค์ด Unix์์ ์ฐ๋ คํ๋ ๋์ผํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์คํํ๋ฉด ICU
๊ฐ ๋ฐฑ์
์ด๋ฏ๋ก ICU
๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค. Unix์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ.
@reflectronic ์ https://github.com/dotnet/runtime/issues/43736#issuecomment -716681586์ ๋ชจ๋ ์ ์์ ์ณ์ต๋๋ค.
์ฌ๊ธฐ https://github.com/dotnet/runtime/issues/43736#issuecomment -716527590์ ์ธ๊ธ ๋ @jbogard ๊ฒฐ๊ณผ์ ๋ํด ์๊ฒฌ์ ๋งํ๋ ค๋ฉด Windows์ ICU ๊ฐ์ ์ธ์ด ๋์์ ๋น๊ตํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ์์ฝํ๋ฉด๋ฉ๋๋ค. ๋ง๋ถ์ฌ์ ํ์ฌ ICU๋ Windows์ ๋ง์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉ๋๊ณ ์์ผ๋ฉฐ ์ฌ์ฉ๋์ด ์ฆ๊ฐ ํ ๊ฒ์ผ๋ก ์์๋ฉ๋๋ค. ๋ํ ์ด๋ฌํ ๊ฒฐ๊ณผ๋ .NET Core 3.1 ์ดํ๊ฐ ์ค์น๋ Linux๋ฅผ ์ ์ธํฉ๋๋ค. ์ด๋ .NET 5.0๊ณผ Linux์ ์ด์ ๋ฒ์ ๊ฐ์ ์ผ๊ด์ฑ์ ๋ณด์ฌ์ค๋๋ค.
์๋ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ์์ ์ ๊นจ์ง ๊ฒ์ ๋๋ค. ์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ด๋ฏธ Linux์์ ์์ ๋์๊ธฐ ๋๋ฌธ์ ์์ ํ ์ฌ์ค์ด ์๋๋๋ค.
StringComparison.Ordinal์ ๊ธฐ๋ณธ ๋น๊ต ์ ๋ต์ผ๋ก ๋ง๋ค๊ธฐ ์ํด ๋ธ๋ ์ดํน ๋ณ๊ฒฝ์ ๊ณ ๋ ค ํ์๊ฒ ์ต๋๊น?
์์ ๋ง์ ๋๋ ธ์ง๋ง ์ด๋ฏธ ์๋ํด ๋ณด์์ง๋ง ๋ถ๋ง์ ํฌ๊ธฐ๊ฐ ๋๋ฌด ์ปค์ ์ ์ฉ ํ ์ ์์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ฐ๋ฐ์๊ฐ ๋ฐ์ดํฐ ์ ๋ ฌ API๋ฅผ ํธ์ถ ํ ๋ ๋ฌธ์์ด ๋น๊ต ํ๋๊ทธ๋ฅผ ์ง์ ํ๋ ๊ฒ์ ์์ํ๋ ๋ฐ ๋์์ด๋๋ ๋ฐฉ๋ฒ์ ์ฐพ๊ณ ์์ต๋๋ค.
์ ๋ ์์ฉ ํ๋ก๊ทธ๋จ์ด ์๋ ์๊ณ๋ฅผ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ญ๋๋ค. ๋๋ ์ด๊ฒ์ ์ฒ๋ฆฌํ๋ ์ปดํ์ผ ํ์ ๋ฐฉ๋ฒ์ ์ ํธํฉ๋๋ค.
์, ์ด๋ฌํ ๊ฒฝ์ฐ ์ผ๋ถ ๋ถ์๊ธฐ๊ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ดํฐ ์ ๋ ฌ API ํธ์ถ์๋ณด๊ณ ์์ ๋๋ ์ธ์ด ์ฐ์ฐ์ ์ฌ์ฉํ๋ ค๋ ์๋๋ฅผ ํ์ํ์ง ์๋ ๊ฒ์ด ๋ฌด์์ธ์ง ํ์ธํฉ๋๋ค.
๋ถ์๊ธฐ๊ฐ ๊ธฐ์กด ํ๋ก์ ํธ์ ์ด๋ค ๋์์ ์ค ์ ์์ต๋๊น?
๋ถ์๊ธฐ๋ ์ฝ๋๋ฅผ ์ค์บํ๊ณ ํ๋๊ทธ๋ฅผ ์ ๋ฌํ์ง ์๋ ๋ฐ์ดํฐ ์ ๋ ฌ API ํธ์ถ์ ๊ฐ์งํ๋ฉด ์ด๋ฌํ ํธ์ถ์ ์ดํด๋ณด๊ณ ๋ฌธ์ ๊ฐ ๊ฐ์ง๋๋ฉด ์์ ํ๋ ๋ฐ ๋์์ด๋ฉ๋๋ค.
๊ทธ๊ฒ์ ๋ํ C # ์ ์ฉ์ ๋๋ค.
๋ณ๊ฒฝ ์ฌํญ์ ์ ์ญ ์ ์ด์ด์ผํ๋ฉฐ C #์ผ๋ก ์ ํ๋์ง ์๋ .NET ๋ฐํ์ ๋ด๋ถ์ ์์ต๋๋ค.
@tarekgh C # ๋ถ์๊ธฐ๋ VB ๋๋ F # ์ฝ๋๋ฒ ์ด์ค์์ ์ด๋ป๊ฒ ํ์๋ฉ๋๊น?
์ฐ๋ฆฌ๊ฐํ๋ ๋๋ถ๋ถ์ ์์ ์
InvariantCulture
์ด๋ฉฐ, ์ ๊ฐ ์ด์ ์ ์ดํด ํ ๋ฐ์ ๋ฐ๋ฅด๋ฉด ์ค๊ณ ์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
๋นํ์ ์ผ๋ก,์ด ๋ณ๊ฒฝ ์ด์ ์๋ ํฌ๋ก์ค ํ๋ซํผ ์ฝ๋์ ๋ํด ์ค์ ๋ก ์ด๊ฒ์ ์์กดํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ์ต๋๋ค. NLS์ ICU์ ๋์ ๋ฐฉ์์ ๋ณํ์ง ์๋ ๋ฌธํ๋ฅผ ์ฌ์ฉํ ๋์๋ ํญ์ ๋์ผํ์ง๋ ์์ต๋๋ค (์ด ๋ฌธ์ ์์ ์ ์ฆ ๋จ). @tarekgh๊ฐ ๋งํ๋ฏ์ด์ด ์ฝ๋๋ Linux์์ ๊ณ์ ๋ค๋ฅด๊ฒ ์๋ํ์ต๋๋ค. ์ด ๋ณ๊ฒฝ ์ฌํญ์ด ์ ์ฉ๋์์ผ๋ฏ๋ก ๋ชจ๋ ์ต์ Windows ์ค์น์ ๋ํด "๋ถ๋ณ ๋ฌธํ"๊ฐ ์๋ฏธํ๋ ๋ฐ๋ ๋ชจ๋ ํ๋ซํผ์์ _ ์ค์ ๋ก _ ์ผ๊ด์ฑ์ด ์์ด์ผํฉ๋๋ค.
์ด๊ฒ์ ๋๋ผ์ด ์ผ์ด ๋ ์ ์์ง๋ง, ๋ค๋ฅธ ๋ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฑ์๊ฐ ์๋ ๋์ ํด์ ๋ ๊ฒ์ฒ๋ผ ์ฌ์ฉ์๋ณด๊ณ ์ ๊ฒฐ๊ณผ๋ก ์๋ ๋์ ํ๋ซํผ ์ฐจ์ด์ ๊ด๋ จ๋ ์์ญ ๊ฐ์ ๋ฒ๊ทธ๋ฅผ ์ฐพ์ ์์ ํ์ต๋๋ค.
.NET 5๊ฐ ์๋ ค์ง์ง ์์ ์๋ ค์ง์ง ์์ ์๋ก์ด ์๋ฌผ์ ๋์ ํ๊ณ ๋ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฟ๋ง ์๋๋ผ ๋ค์ด ์คํธ๋ฆผ ์ข ์์ฑ์ ๋ํ ์์ ์ฌํญ์ ๋ค์ ๊ฒํ ํ ๊ฒ์ด๋ผ๋ ์ ๋ง์ ํฅ๋ถํ์ง ์์ต๋๋ค. ์ด๋ ์ฌ์ฉ์์๊ฒ ์๋ก์ด ์์ฐ์ฑ ํฅ์์ ๊ฐ์ ธ ์ค์ง ์๋ ์๋นํ ๊ฒฝ์ ์ ๋น์ฉ์ ๋๋ค. MSFT์ ๋๊ตฐ๊ฐ๋ ์ด๋ฌํ ๋ณ๊ฒฝ์ ๋ํ ๋น์ฉ / ํธ์ต ๋ ผ์์์์ด๋ฅผ ๊ณ ๋ คํด์ผํฉ๋๋ค.
ํธ์ง : ์ด๋ฏธ ๊ธฐ์ ์ ์ธ ์ฅ์ ์ ์ป์์ต๋๋ค-์, ๊ฐ์ฌํฉ๋๋ค. ๋น์ฉ์ด ์๋ ์ด๋ฌํ ๋ณ๊ฒฝ์ผ๋ก ์ธํ ๋ช ๋ฐฑํ์ง ์์ ๊ฒฝ์ ์ ์ด์ต์ ํ๋งคํ๋๋ก ๋์์ฃผ์ธ์. ์ด ๋ฌธ์ ๊ฐ ์ด๋ป๊ฒ ๋ํ๋๋์ง ๊ณ ๋ คํ ๋ ์ฌ์ฉ์๊ฐ ๋์ฝํ๊ณ .NET 5๋ก ์ ๊ทธ๋ ์ด๋ํด์ผํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
@tarekgh C # ๋ถ์๊ธฐ๋ VB ๋๋ F # ์ฝ๋๋ฒ ์ด์ค์์ ์ด๋ป๊ฒ ํ์๋ฉ๋๊น?
๋จ์ผ ๋ถ์๊ธฐ๋ก C # ๋ฐ VB๋ฅผ ์ฒ๋ฆฌ ํ ์ โโ์์ง๋ง (๊ฐ๋ฅํ ๊ฒฝ์ฐ ๋ถ์๊ธฐ๋ฅผ ์ธ์ด์ ๊ตฌ์ ๋ฐ์ง ์๊ฒ ๋ง๋ค๊ธฐ ์ํด ๋ ธ๋ ฅํ๊ณ ์์ต๋๋ค) ํ์ฌ F #์ ๋ํ ๋ถ์๊ธฐ ์ ์ฉ ๋ฒ์๋ฅผ ์ป์ ์ ์์ต๋๋ค.
@Aaronontheweb ๋ฌธํ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ๋ชจ๋ ์ฌ๋์ ICU ๋ณ๊ฒฝ์ํ์ง ์์๋๋ผ๋ ๋ณ๊ฒฝ๋์ง ์์ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค. Windows ํ์ https://docs.microsoft.com/en-us/archive/blogs/shawnste/locale-culture-data-churn ๋ธ๋ก๊ทธ์์ NLS ๋์๋ ๊ฐ์ ์ ์ํด ๋ณ๊ฒฝ๋๊ณ ์์์ ์๋ ค์ค๋๋ค. ๋ฐ๋ผ์ ์ฌ๊ธฐ์ ๋ฌธ์ ๋ ์ฑ / ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ด์ ์์ ์๋ชป๋ ๊ฐ์ ์ ํฌ์ฐฉํ๋ ๊ฒ ์ด์์ผ๋ก ICU๋ก ์ด๋ํ๋ ๊ฒ์ด ์๋๋๋ค. 5.0์ผ๋ก ์ ๊ทธ๋ ์ด๋ํ๋ ๊ฒ์ ๋ค๋ฅธ ์ด์ ๋ฒ์ ์ผ๋ก ์ ๊ทธ๋ ์ด๋ํ๋ ๊ฒ๊ณผ ๋์ผํฉ๋๋ค. ์ฑ์ ์๋กญ๊ณ ๋ฉ์ง ๊ธฐ๋ฅ์ ๋ง์ด ๊ฐ๊ฒ ๋ ๊ฒ์ด๋ฉฐ ์ฑ์ ๋ฆด๋ฆฌ์ค ์ฌ์ด์ ๋ช ๊ฐ์ง ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด์์ ์ ์์ผ๋ฏ๋ก ํ ์คํธํด์ผํฉ๋๋ค. ์ฐ๋ฆฌ๋ ํญ์ ์ธ๊ณํ๊ฐ OS์ OS ๋ฒ์ ์ฌ์ด์์ ์ธ์ ๋ ์ง ๋ฐ๋ ์ ์๋ค๊ณ ๋งํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ธ๊ณํ ๋์ ๋ณํ๊ฐ ์ ๋ง๋ก ๊นจ์ง๋ ๊ฒ์ ๊ณ ๋ คํ์ง ์์ต๋๋ค. ์์ ์ธ๊ธํ๋ฏ์ด NLS๋ฅผ ๊ณ์ ์ฌ์ฉํ์ฌ 5.0์ผ๋ก ์ ๊ทธ๋ ์ด๋ํ๋๋ก ์ ํํ ์์๋ ๊ตฌ์ฑ ์ค์์น๊ฐ ์์ต๋๋ค. ICU๋ ์ค์ ๋ก ์ ๊ทธ๋ ์ด๋ ๊ฒฐ์ ์ ์์๊ฐ ์๋๋๋ค. ์ด์ ICU๋ฅผ ํตํด ์ฑ์ OS ์ ๋ฐ์ ๊ฑธ์ณ ์ผ๊ด์ฑ์ ๋์ผ ์์๋ ๊ธฐํ๋ฅผ ๊ฐ๊ฒ๋๋ฉฐ ์ฑ ๋ก์ปฌ ICU๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ ๊ฒฝ์ฐ ์ธ๊ณํ ๋์์ ๋ ๋ง์ด ์ ์ด ํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ด์ ๋ณด๋ค ํจ์ฌ ๋ ๋ง์ ์ ์ด๊ถ์ ์ฑ์ ์ ๊ณตํ๊ณ ์์ต๋๋ค.
๊ด๋ จ : https://github.com/dotnet/runtime/issues/43802
(์ด ๋ฌธ์ ๋ IndexOf
_per se_๋ฅผ ์ถ์ ํ์ง ์์ต๋๋ค. ์คํ๋ ค ๋ฌธํ ์ธ์ ๋น๊ต์๋ฅผ ๊ธฐ๋ณธ์ผ๋กํ๋ Compare
๋ฃจํด์ ์๋ํ์ง ์์ ๊ฒฐ๊ณผ์ ๋ํด ์ค๋ช
ํฉ๋๋ค.)
๋ถ์๊ธฐ๊ฐ ๊ธฐ์กด ํ๋ก์ ํธ์ ์ด๋ค ๋์์ ์ค ์ ์์ต๋๊น?
๋ถ์๊ธฐ๋ ์ฝ๋๋ฅผ ์ค์บํ๊ณ ํ๋๊ทธ๋ฅผ ์ ๋ฌํ์ง ์๋ ๋ฐ์ดํฐ ์ ๋ ฌ API ํธ์ถ์ ๊ฐ์งํ๋ฉด ์ด๋ฌํ ํธ์ถ์ ์ดํด๋ณด๊ณ ๋ฌธ์ ๊ฐ ๊ฐ์ง๋๋ฉด ์์ ํ๋ ๋ฐ ๋์์ด๋ฉ๋๋ค.
csproj์ ๋ถ์๊ธฐ๋ฅผ ์ถ๊ฐํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด๊ฒ์ ์๋์ผ๋ก ๋ฐ์ํ์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ง์ ๊ธฐ์กด ํ๋ก์ ํธ๊ฐ ์ด๋ฌํ ๋ถ์๊ธฐ์์ด .NET 5๋ก ์ด๋ ๋ ๊ฒ์
๋๋ค.
๋ํ ์ด๋ฏธ ์ธ๊ธํ๋ฏ์ด F # ํ๋ก์ ํธ์๋ ๋์์ด๋์ง ์์ต๋๋ค.
@jeffhandley ๊ฐ์ฌํฉ๋๋ค, ๋ด๊ฐ ์ด๋ฏธ ์ดํด ํ ๊ฒ์ ํ์ธํฉ๋๋ค. ๋ฐ๋ผ์ ๊ฐ๋ฅํ "ํด๊ฒฐ ๋ฐฉ๋ฒ"์ด F # ์ฌ์ฉ์์๊ฒ ๋์์ด๋์ง ์๋๋ค๋ ์ ์ ์ธ์ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค (์์ ์์ฅ์ด์ง๋ง .NET์ ์ผ๋ฅ ์๋ฏผ์ผ๋ก์ MS์์ ์์ ํ ์ง์ํ๋ ์์ฅ). ์ด๊ฒ์ด ๋ฌด์์ ์๋ฏธํ๋์ง ์ ํ ๋ชจ๋ฆ ๋๋ค.
๋ณ๊ฒฝ ์ฌํญ์ ์ ์ญ ์ ์ด์ด์ผํ๋ฉฐ C #์ผ๋ก ์ ํ๋์ง ์๋ .NET ๋ฐํ์ ๋ด๋ถ์ ์์ต๋๋ค.
์ด๊ฒ์ด ๋ฌด์์ ์๋ฏธํ๋์ง ์ ํ ๋ชจ๋ฆ ๋๋ค.
๋ณ๊ฒฝ ์ฌํญ์ ์ ์ญ ์ ์ด์ด์ผํ๋ฉฐ C #์ผ๋ก ์ ํ๋์ง ์๋ .NET ๋ฐํ์ ๋ด๋ถ์ ์์ต๋๋ค.
.NET ๋ฐํ์์ ์ฌ์ฉํ๋ ๋ชจ๋ ์ธ์ด๊ฐ C #๋ฟ๋ง ์๋๋ผ ์ํฅ์๋ฐ์ ๊ฒ์์ ์๋ฏธํ์ต๋๋ค.
๋๋ ํนํ ๊ณํ์ด ํ์ฌ ํ๋์ ๋ฐ๊พธ๋ ๊ฒ์ด๋ผ๋ฉด ์๋ก์ด ์ธ๊ณ์์ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌ ํ ๋ถ์๊ธฐ๊ฐ ์์ด์ผํ๋ค๋ ๋ด ์๊ฒฌ์ ๋ค์ ๊ฐํ๊ฒ ๋งํ ๊ฒ์ด๋ค.
๋๋ ๊ทธ๋ ๊ฒํ๋ ๊ฒ์ ๊ธฐ์ ์ ์ฅ์ ์ ์์ ํ ์ดํดํ๋ฉฐ ๋ณ๊ฒฝํ์ง ๋ง๋ผ๊ณ ์ ์ํ๋ ๊ฒ์ด ์๋๋๋ค (์ฅ๊ธฐ์ ์ผ๋ก ์ด๊ฒ์ด ์ฌ๋ฐ๋ฅธ ์กฐ์น ์ธ ๊ฒ ๊ฐ์ต๋๋ค). ์ด๋ฏธ ๋ชจ๋ฒ ์ฌ๋ก๋ก ๋ฌธ์ํ๋์ง ์์๋ค๊ณ ๋งํ๋ ๊ฒ๋ ์๋๋๋ค. ๋ด๊ฐ ๋งํ๋ ๊ฒ์ ์ฐ๋ฆฌ๊ฐ .NET 5๋ก ์ฎ๊ธฐ๋ ค๊ณ ์๋ํ๋ ๊ฐ๋ฐ์๋ค์๊ฒ ์ด๊ฒ์ด ์ ๋ง๋ก ํฌ๊ณ , ๋นจ๊ฐ์์ด๊ณ , ๊น๋ฐ์ด๋ ์ค๋ฅ๊ฐ ๋ ํ์๊ฐ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ฆ์ ๊ฐ๋ฐ์๋ค์ ์ด๊ฒ์ด "๊ทธ๋ฅ ์๋ํ๋ค"๊ณ ๊ฐ์ ํ ๊ฒ์ ๋๋ค.
ํ์ฌ @meziantou ์์ด Roslyn ๋ถ์๊ธฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ https://github.com/meziantou/Meziantou.Analyzer/tree/master/docs.
์ด ํน๋ณํ ๊ฒฝ์ฐ MA0074๊ฐ ๋ฐ์ํฉ๋๋ค-์์ ์ ๋ฌธํ์ ๋ฏผ๊ฐํ ๋ฐฉ๋ฒ์ ํผํ์ญ์์ค
์ด๊ฒ์ ์ ๋ง๋ก ์์์์ ๋ฒ์ด๋ ๊ฒ์ด ํ์ํ๋ค๊ณ ๋งํ๋ฉด์ ์ฌ๊ธฐ ์์ด Roslyn ๋ฌธ์ ๋ฅผ ์ด์์ต๋๋ค .https : //github.com/dotnet/roslyn-analyzers/issues/4367
@tarekgh ๋ช ํํ
์ฐ๋ฆฌ๋ ๊ฐ๋ฐ์๊ฐ IndexOf์ ๊ฐ์ ๊ฒ์ ํธ์ถ ํ ๋ ์์์ ๊ฐ๊ณ ์๋๋ฅผ ํํํ๊ธฐ ์ํด ์๋์ ์ผ๋ก StringComparison ํ๋๊ทธ๋ฅผ ์ ๊ณต ํ ์ ์๋๋ก ๋ ๋ง์ ๋ฐฉ๋ฒ์ ์ฐพ๊ณ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋น์ ์ด ์๊ฐ ํด๋ผ ์์๋ ๋ชจ๋ ์์ด๋์ด๋ฅผ ํ์ํฉ๋๋ค.
[Obsolete]
์์ฑ์ ์ฌ์ฉํ์ฌ ์ด์ ๋ฉ์๋๋ฅผ ํ๊ธฐํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น?
API ํ๋ฉด์ ๋์ผํ์ง๋ง ๋์์ด ๋ณ๊ฒฝ๋๋ฉด .NET Standard ํธํ์ฑ์ ์ด๋ป๊ฒ๋ฉ๋๊น?
๊ทธ๋ ์ ํด๋ฌ์คํฐ๋ฅผ ์กด์คํ๊ธฐ์ํ ๋ณ๊ฒฝ์ ์ํฅ์ด ์ ๋ฌธ์ํ๋์ด์๋ ํ ๋๋ฅผ ๊ดด๋กญํ์ง ์์ต๋๋ค. ๋ฐ์ ํ๊ฒ ๊ด๋ จ๋ ๋ฌธ์์ด ๋ฉ์๋ ํจ๋ฐ๋ฆฌ ๊ตฌ์ฑ์์ด ์๋ก ์ผ๊ด๋์ง ์๊ฒ ๋์ํ๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋๋ค.
๋ฌธ์, ์์ ํด๋ฌ์คํฐ ๋๋ ๋ก์ผ์ผ์ ๋ชจํธํจ๊ณผ ๋ฌด๊ดํ๊ฒ ๋น๊ณต์์ ์ธ ๋ฌธ์์ด ๋ญํน์ ์ํํ๋ ์ฌ๋์ str.Contains (whatever)๊ฐ ์ฑ๊ณตํ๋ฉด str.IndexOf (whatever ) ์ฐ๋ฆฌ๋ ๋ฐฉ๊ธ ๊ทธ๊ฒ์ด ๊ฑฐ๊ธฐ์ ์๊ณ ๋ฐ๋ผ์ ์ฐพ์ ์ ์๋ค๊ณ ๋ค์ ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด๋ค ๋ ๋ฒ์งธ ๋งค๊ฐ ๋ณ์๊ฐ ๊ธฐ๋ณธ๊ฐ์ธ์ง๋ ์ค์ํ์ง ์์ต๋๋ค. ๊ธฐ๋ณธ๊ฐ์ ๋ฉ์๋๊ฐ์ ๋์ผ ํ๊ฒ ์๋ํ๋ฏ๋ก ์ฌ์ฉํ๊ธฐ ์ํด ๋ชจ๋ ๋ฏธ๋ฌํจ์ ์ฐ๊ตฌ ํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ด์ ๊ฐ์ ๋ถ์ผ์น๋ ์ ๋ฌธ๊ฐ ๋ง์ด ์ฑ๊ณต์ ์ผ๋ก ์ฌ์ฉํ ์์๋ ์ธ์ด๋ฅผ ์์ฑํ๊ณ ์ฝ๋ ์บ ํ์์ ๋์ค๋ ์ฌ๋๋ค์ ์์ธ์ํต๋๋ค. ์ด๋ฐ ์์ผ๋ก ์ง์ ํ๊ธฐ ์ํด ๊ธฐ์ค์ ๋์ด ์ง ๋ง์ญ์์ค.
@lupestro์ ๋์ํฉ๋๋ค. ๋ฉ์๋ ๋์์ ๋ถ์ผ์น๋ ๋งค์ฐ ์ฐ๋ ค๋ฉ๋๋ค. ์ค๋ ์ง์๋๋ ๋ฐฉ๋ฒ์ด ๋ค๋ฅด๊ฒ ํ๋ํ๊ณ ์ผ๊ด๋์ง ์๊ฒ ํ๋ํ๋ค๋ฉด ๋ง์ ์ฌํ์ด์์ ๊ฒ์ ๋๋ค. ์ฌ๋๋ค์ ์ด๊ฒ์ ๋ถ๋ช ํ๊ณ API์ ๋ฐฐ์ ๊ฐ์ ๋๋ผ๊ณ ๋ค๋ฅธ ์๊ฐ ํญํ์ด ํญ๋ฐํ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์๋ ๊ฒ์ ๊ถ๊ธํด ํ ๊ฒ์ ๋๋ค. ๋ง์ ์ฌ๋๋ค์ด .NET ์ ์ ์๋ค์ด ์ด๋ฐ ์ข ๋ฅ์ ๋ฌธ์ ์ ๋ํด C #์ ์ธ ๊ฒ์ ๋๋ค. ๋ก์ผ์ผ์ ํ์ฉํ์ง ์๋ ์ค๋ฒ๋ก๋๋ฅผ ์ ๊ฑฐํ๊ฑฐ๋ ๋ฉ์๋์ ๊ธฐ๋ณธ ๋ก์ผ์ผ์ ์ ๊ทํํด์ผํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ด๋ฏธ Compare ๋ฐ CompareOrdinal์ด ์์ผ๋ฉฐ (Last) IndexOf (Any) ๋ฐ (Last) IndexOf (Any) Ordinal์ด ํ์ํ ์ ์์ต๋๋ค. ๋๋ ๊ทธ ํด๊ฒฐ์ฑ ์ ์ข์ํ์ง ์์ง๋ง ์ ์ด๋ ํ์ฌ ์กด์ฌํ๋ ๊ฒ๊ณผ ์ผ์น ํ ๊ฒ์ ๋๋ค. ์๋ง๋ ๋ฌธ์์ด์์ ์์ ์ฌ์ฉ์ ๋ํ ์์ด๋์ด๋ ๊ฐ๊ฐ ์๊ฐ๋์ด์ผํฉ๋๋ค. ๋น ๋ฅด๊ฑฐ๋ ์ณ์ ๊ฒ์ ์ ํํด์ผํ๋ค๋ฉด ๋งค๋ฒ '์ณ์'์ ์ ํํ๊ฒ ์ต๋๋ค. ์ผ๊ด๋์ง ์๊ณ ์ง๊ด์ ์ด์ง ์์ ํ๋์ ๋งค์ฐ ์ค๋ง ์ค๋ฝ์ต๋๋ค.
์ด ๋ฌธ์ ๋ ์ด๋ฏธ ์ข ๊ฒฐ๋์์ผ๋ฏ๋ก .NET 5.0์์ ์์ผ๋ก ๋์๊ฐ ๊ฒ์ด๋ผ๊ณ ์ด๋ฏธ ๊ฒฐ์ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด ๋ฌผ๊ฑด์ ์ด๋ ต๊ณ ๋ฌธํ (์๊ฐ๊ณผ ๊ฐ์) ์ ๋ณด๋ ๋ชจ๋ ์ข ๋ฅ์ ๋น ๊ธฐ์ ์ ์ธ ์ด์ ๋ก ๋ณ๊ฒฝ ๋ ์ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ๊ฐ๋ฐ์๋์ด๋ฅผ ์ธ์ํด์ผํ์ง๋ง ์์ฒด ์ผ๊ด์ฑ์ ์ ์งํ๋ ค๋ฉด API์ ์์กดํด์ผํฉ๋๋ค. ๋ฌธ์ ๋ฅผ ๋ํ๋ด๋ @aolszowka ๊ฐ ์ง์ ํ ๊ฒฝ๊ณ (5.0์์)๊ฐ ์์ด์ผํ๋ฉฐ ๋ ์ค์ํ ๊ฒ์ ๋ฌธ์ ์ธ ์ด์ ์ ๋๋ค. ์์ผ๋ก ๋์๊ฐ๋ ๊ฒ์ด ์ค์ํ๋ฉฐ ๋๋ก๋ ์ค๋๋ ํ๋ / ๊ฐ์ ์ "ํ๊ดด"ํด์ผํ๋ค๋ ์๋ฏธ์ ๋๋ค. ๊ทธ๋ ๋ค๊ณ ์๋ก์ด ๋ถ์ผ์น๊ฐ ๋์ ๋์ด์ผ ํจ์ ์๋ฏธํ์ง๋ ์์ต๋๋ค. ์ด ๋ณ๊ฒฝ์ ์ฝ๋๋ฟ๋ง ์๋๋ผ ๊ธฐ๋์น๋ฅผ ๊นจ๋จ๋ฆฝ๋๋ค. ๋ฉ์๋๋ฅผ ์ผ๊ด๋๊ฒ ๋ง๋ค ์์๋ ๊ฒฝ์ฐ์๋ ๋์ค์ ๋ด ์ฝ๋๋ฅผ ๋ ๋ ค ๋ฒ๋ฆฌ๋ ์ง๊ด์ ์ด์ง ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด์๋ ๊ฒ๋ณด๋ค CultureInfo๋ฅผ ๋ช ์ ์ ์ผ๋ก ์ง์ (ํ์ฅ ๋ฉ์๋๋ฅผ ํตํด ์ฒ๋ฆฌ ํ ์ โโ์์)ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์คํธ๋ ์ค๊ฐ ๋ง์ ๊ฐ๋ฐ์ฃผ๊ธฐ ๋๋ ์ต์ ์ ๊ณ ๊ฐ ์ค์น.
TLDR : ๋ณ๊ฒฝ์ด ํ์ํ ์ฌํญ์ ๋ณ๊ฒฝํ์ง๋ง API์ ์ผ๊ด์ฑ์ ์ ์งํ์ง ๋ง์ญ์์ค. ๋ถ์๋ ค๋ฉด ๋ ๋์ ๊ฒ์ผ๋ก ๊ต์ฒดํ์ญ์์ค.
๋๋ ์๋ ๊ฐ .NET์ ์ฌ์ฉํด ์์ผ๋ฉฐ ์ด๋ฌํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ๋ ํญ์ InvariantCulture๋ก ๊ธฐ๋ณธ ์ค์ ๋์ด ์์ต๋๋ค. ์์ด ์ด์ธ์ ์ธ์ด์ ๊ด๋ จํ์ฌ ์ ๋ ํญ์ ๋ค๋ฅธ ์ธ์ด ๋ณ ๋ฌธ์์ ๋ณ์นญ์ผ๋ก ์๋ํ๋ ๋ฌธ์ ์๊ณผ CurrentCulture๋ฅผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋น๊ตํ ๋ ์ด๋ฌํ ์์ ํ์ธํ๋ ์ถ๊ฐ ์์ ์ ์๊ณ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ธ๋ผ์ฐ์ ์์ ๋ณด๋ธ ์ฌ์ฉ์๊ฐ ์ ํธํ๋ ์ธ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ค๋ ๋์ CurrentCulture๋ฅผ ์ค์ ํ๋ ASP.NET ์ฝ๋๋ฅผ ์์ฑํ ๋ ์ด๋ก ์ธํด ์ ๋ฅผ ๋ฌผ์๊ณ , ์์ด๋ฅผ ์ฌ์ฉํ์ง ์๋ ์ฌ์ฉ์์ ๋ํ ๋น๊ต๋ ์ฝ๋๋ฅผ ๋ฏธ๋ฌํ๊ฒ ๊นจ๋จ๋ฆฝ๋๋ค. ํนํ ๋ฌธ์์ด์ ์ฌ์ฉ์๊ฐ ์ ๋ ฅ ํ (์ธ์ด) ํ ์คํธ์ ์์ ํ ์คํธ๊ฐ ํผํฉ ๋ ๊ฒฝ์ฐ
์ด ์ ๋ ์ฝ๋ grapheme ํด๋ฌ์คํฐ ๋์์ ๋ด๊ฐ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ฒ๋ผ Invariant ์ค๋ฒ๋ก๋๋ฅผ ์ฌ์ฉ ํ๋๋ผ๋ ์ค ๋ฐ๊ฟ ๋ฐ ์บ๋ฆฌ์ง ๋ฆฌํด์ ๋ํ ์์ ๋์์ ์์ํ๊ธฐ ๋๋ฌธ์ ๋์๊ฒ ์๋ก์ด ๊ฒ์ ๋๋ค. ๋ ๋ง์ ์์ ์ ์ํ ํ๊ณ ์ ๋ฌธ ์ง์ ์ด
์ค๋๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ ์ฐ๋ฆฌ๊ฐ ๊ณ ๋ คํ๊ณ ์๋ ํ ๊ฐ์ง์ ๋๋ค. ์ด์ ๋ฐค์ ์ ์ ์ด์์ ์์ฑํ๊ณ ๋ด๋ถ ๊ฒํ ๋ฅผ ์ํด ์ผํ ์ค์ด๋ฉฐ ๋ช ์๊ฐ ํ์ ์ฌ๊ธฐ์ ์ ๋ฌธ์ ๋ก ๊ฒ์ ํ ๊ฒ์ ๋๋ค.
์ด์์ https://github.com/dotnet/runtime/issues/43956์ ๊ฒ์๋ฉ๋๋ค
๋ฒ๊ทธ๋ฅผ๋ณด๊ณ ํ๋ ๊ฒฝ์ฐ ์๋ก์ด ๋ฌธ์ ๋ฅผ ์ ์ถํ๊ณ ํด๋น ์๋ก์ด ๋ฌธ์ ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฒ๊ทธ๋ฅผ ์ค๋ช ํ์ญ์์ค.
์ด ํน์ ๋ฌธ์ ( "\r\n"
๋ "\n"
)์ ๋ํ ์๊ฒฌ์ด ์์ผ์๋ฉด์ด ์ค๋ ๋์์ ๊ณ์ ์๋ต ํด์ฃผ์ญ์์ค. ๊ฐ์ฌ!
@GrabYourPitchforks ๋ฌธ์์ ์ค๋ช ๋ ์ ๊ทผ ๋ฐฉ์์ ๊ณ ๋ คํ๋ ๋์ ๋ค์ ์ฝ๋ ๋ค.
์ฌ๊ธฐ์ ๋ช ํํ ํผ๋๋ฐฑ์ด ๋ง์ด ์์ต๋๋ค. ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ ์ฐพ๊ธฐ ์ํด ๋ ธ๋ ฅํ๊ณ ์์ผ๋ฉฐ์ด ๋ฌธ์ ๋ฅผ ๊ณ์ ์ ๋ฐ์ดํธ ํ ๊ฒ์ ๋๋ค.
๊ทธ๋ ์ ํด๋ฌ์คํฐ๋ฅผ ์กด์คํ๊ธฐ์ํ ๋ณ๊ฒฝ์ ์ํฅ์ด ์ ๋ฌธ์ํ๋์ด์๋ ํ ๋๋ฅผ ๊ดด๋กญํ์ง ์์ต๋๋ค. ๋ฐ์ ํ๊ฒ ๊ด๋ จ๋ ๋ฌธ์์ด ๋ฉ์๋ ํจ๋ฐ๋ฆฌ ๊ตฌ์ฑ์์ด ์๋ก ์ผ๊ด๋์ง ์๊ฒ ๋์ํ๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋๋ค.
๋ฌธ์, ์์ ํด๋ฌ์คํฐ ๋๋ ๋ก์ผ์ผ์ ๋ชจํธํจ๊ณผ ๋ฌด๊ดํ๊ฒ ๋น๊ณต์์ ์ธ ๋ฌธ์์ด ๋ญํน์ ์ํํ๋ ์ฌ๋์ str.Contains (whatever)๊ฐ ์ฑ๊ณตํ๋ฉด str.IndexOf (whatever ) ์ฐ๋ฆฌ๋ ๋ฐฉ๊ธ ๊ทธ๊ฒ์ด ๊ฑฐ๊ธฐ์ ์๊ณ ๋ฐ๋ผ์ ์ฐพ์ ์ ์๋ค๊ณ ๋ค์ ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด๋ค ๋ ๋ฒ์งธ ๋งค๊ฐ ๋ณ์๊ฐ ๊ธฐ๋ณธ๊ฐ์ธ์ง๋ ์ค์ํ์ง ์์ต๋๋ค. ๊ธฐ๋ณธ ์ค์ ์ ๋ชจ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๊ธฐ ์ํด ๋ชจ๋ ๋ฏธ๋ฌํ ๋ถ๋ถ์ ์ฐ๊ตฌ ํ ํ์๊ฐ ์๋๋กํ๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ๋ฐฉ๋ฒ์์ _ ๋์ผํ๊ฒ ๋์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ด์ ๊ฐ์ ๋ถ์ผ์น๋ ์ ๋ฌธ๊ฐ ๋ง์ด ์ฑ๊ณต์ ์ผ๋ก ์ฌ์ฉํ ์์๋ ์ธ์ด๋ฅผ ์์ฑํ๊ณ ์ฝ๋ ์บ ํ์์ ๋์ค๋ ์ฌ๋๋ค์ ์์ธ์ํต๋๋ค. ์ด๋ฐ ์์ผ๋ก ์ง์ ํ๊ธฐ ์ํด ๊ธฐ์ค์ ๋์ด ์ง ๋ง์ญ์์ค.
์, ์ด๊ฒ์ ๋ด ๊ฑฑ์ ์ ์์ ํ ํํํ์ต๋๋ค. ์ผ๋ฐ์ ์ธ ์ค๊ตญ ๊ฐ๋ฐ์๋ก์ ์ฐ๋ฆฌ๋ ์์ฉ ํ๋ก๊ทธ๋จ ์ฝ๋์์ ๋ฌธ์์ด ๊ด๋ จ ๋ฉ์๋๋ฅผ ํธ์ถ ํ ๋ StringComparison
๋๋ CultureInfo
๋ช
์ ์ ์ผ๋ก ์
๋ ฅํ๋ ๊ฒฝ์ฐ๊ฐ ๊ฑฐ์ ์์ผ๋ฉฐ ์ ๋๋ก ์๋ํฉ๋๋ค. ์ฐ๋ฆฌ๋ IndexOf
์ Contains
์ฌ์ด์ ๋ค๋ฅธ ํ๋์ ๊ธฐ๋ํ์ง ์์ต๋๋ค!
.net 5.0
.net ์ฝ์ด 3.1
.๋ท ํ๋ ์ ์ํฌ
@lupestro์ ๋์ํฉ๋๋ค. ๋ฉ์๋ ๋์์ ๋ถ์ผ์น๋ ๋งค์ฐ ์ฐ๋ ค๋ฉ๋๋ค. ์ค๋ ์ง์๋๋ ๋ฐฉ๋ฒ์ด ๋ค๋ฅด๊ฒ ํ๋ํ๊ณ ์ผ๊ด๋์ง ์๊ฒ ํ๋ํ๋ค๋ฉด ๋ง์ ์ฌํ์ด์์ ๊ฒ์ ๋๋ค.
์๋ง๋ ์ฌ๊ธฐ์ ํต์ฌ์ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ํญ์ ์ผ๊ด์ฑ์ด ์๋ค๋ ๊ฒ์
๋๋ค. .NET 5.0์์ ๊ฐ์๊ธฐ ์ผ๊ด์ฑ์ด ์์ด์ง์ง๋ ์์์ต๋๋ค. ๋ด๊ฐ ์ผ์ ์ฌ๋ฐ๋ฅด๊ฒ ๋ฐ๋ฅด๊ณ ์๋ค๋ฉด IndexOf
๋ ํญ์ ํ์ฌ ๋ฌธํ ๋น๊ต๋ฅผ ์ฌ์ฉํ๊ณ Contains
๋ ํญ์ ์์ ๋น๊ต๋ฅผ ์ฌ์ฉํ์ต๋๋ค. ํ๊ฐ ๋ .NET 5.0์ ๋ ๋ง์ ๋ถ์ผ์น๋ฅผ ์ถ๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฌ๊ธฐ์ ์ค์๋ ์ด๋ฌํ ๋ถ์ผ์น๋ฅผ ํ์ฉํ๋ ์๋ API ์ค๊ณ์์์์ต๋๋ค.
๋ด๊ฐ ์ผ์ ์ฌ๋ฐ๋ฅด๊ฒ ๋ฐ๋ฅด๊ณ ์๋ค๋ฉด IndexOf๋ ํญ์ ์์ ๋น๊ต๋ฅผ ์ฌ์ฉํ๊ณ Contains๋ ํญ์ ํ์ฌ ๋ฌธํ ๋น๊ต๋ฅผ ์ฌ์ฉํ์ต๋๋ค. ํ๊ฐ ๋ .NET 5.0์ ๋ ๋ง์ ๋ถ์ผ์น๋ฅผ ์ถ๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฌ๊ธฐ์ ์ค์๋ ์ด๋ฌํ ๋ถ์ผ์น๋ฅผ ํ์ฉํ๋ ์๋ API ์ค๊ณ์์์์ต๋๋ค.
๋ง์ต๋๋ค.ํ์ง๋ง ๋ฐ๋์ ๊ฒฝ์ฐ IndexOf(string)
๋ ํ์ฌ ๋ฌธํ๋ฅผ ์ฌ์ฉํ๊ณ IndexOf(char)
๋ ์์๋ฅผ ์ฌ์ฉํ๊ณ Contains
๋ ์์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ต๊ทผ์ ๋ค๋ฅธ ์ฌ๋๋ค์ด ์ธ๊ธ ํ IndexOf
๋ Contains
์ฐจ์ด์ ๋ํด ๊ฐ๋ตํ ์ค๋ช
ํ๊ฒ ์ต๋๋ค.
IndexOf(string)
๋ ํญ์ _CurrentCulture_ ๋น๊ต๋ฅผ ๊ฐ์ ํ์ผ๋ฉฐ Contains(string)
๋ ํญ์ _Ordinal_ ๋น๊ต๋ฅผ ๊ฐ์ ํ์ต๋๋ค. ์ด ๋ถ์ผ์น๋ .NET Framework์์ ๋ค์ ์กด์ฌํ์ต๋๋ค. ์ด๋ .NET 5์ ๋์
๋ ์๋ก์ด ๋ถ์ผ์น๊ฐ ์๋๋๋ค. ์๋ฅผ ๋ค์ด .NET Framework (Windows์ NLS ๊ธฐ๋ฅ์ ์ฌ์ฉ)์์ ํฉ์ "รฆ"์ ๋ ๋ฌธ์ ๋ฌธ์์ด "ae"๋ ์ธ์ด ๋น๊ต ์์์ ๋์ผํ ๊ฒ์ผ๋ก ๋น๊ต๋ฉ๋๋ค. ์ด๋ก ์ธํด ๋ค์๊ณผ ๊ฐ์ ๋ถ์ผ์น๊ฐ ๋ฐ์ํฉ๋๋ค.
// Sample on .NET Framework, showing Contains & IndexOf returning inconsistent results
Console.WriteLine("encyclopรฆdia".Contains("ae")); // prints 'False'
Console.WriteLine("encyclopรฆdie".IndexOf("ae")); // prints '8' (my machine is set to en-US)
์ด๋ฌํ ๋ถ์ผ์น๋ 10 ๋ ์ด์ ์กด์ฌ ํด ์์ต๋๋ค. ๋ฌธ์ํ ๋์ด ์์ผ๋ฉฐ ์ด์ ๋ํ https://github.com/dotnet/runtime/issues/43956 ์์ ์ํ๊ณ๋ฅผ ๋์ฑ ๊ฑด์ ํ๊ฒ ๋ฐ์ ์ํฌ ์์๋ ๋ฐฉ๋ฒ์ ๋ํด ๋ ผ์ํ๊ณ ์์ต๋๋ค.
์ด ํน์ ๋ฌธ์ ์ ๋ํด ์ฐ๋ฆฌ๊ฐ ์ง์ ์ผ๋ก ์๋ฌธํ๊ณ ์๋ ๊ฒ์ "๋ถ์ผ์น๊ฐ ์์ํ ์กด์ฌํ์์ ๊ฐ์ํ ๋,์ด ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ๋ ํฐ ์ํ๊ณ์ ํด๋ฅผ ๋ผ์น๊ธฐ ์ ์ _ ์ค์ ๋ก _ ์ดํ ํ ์์๋ ๊ฑฐ๋ฆฌ๋ ์ผ๋ง์ ๋๊น?"์ ๋๋ค. ์ฐ๋ฆฌ๋ ์ฌ์ ํ ๊ทธ ์๊ณ ๊ฐ์ด ์์ด์ผ ํ ๊ณณ์ ์ ์ํ๋ ค๊ณ ๋ ธ๋ ฅํ๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด์ ๊ฐ์ ๋ณด๊ณ ์๋ ์ฌ๋๋ค์ด ์ค์ ๋ก ์ด๋ฌํ API๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๊ณผ ๊ณ ๊ฐ์ ํ๋์ ๋ํด ๊ธฐ๋ํ๋ ๋ฐ์ ๋ํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ _ ๋งค์ฐ ์ ์ฉํฉ๋๋ค _. ํ๋ ์ ์ํฌ์ ๊ด๋ฆฌ์๋ก์ ์ฐ๋ฆฌ๋ ๊ธฐ์ ๋ฌธ์๋ฟ๋ง ์๋๋ผ ์ค์ ์ฑ์ด ์ด๋ฌํ API๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์๋ ๊ณ ๋ คํด์ผํฉ๋๋ค.
์ด ์๊ฒฌ์ ํน์ ๊ด์ ์ ๋ฐฉ์ดํ๊ธฐ์ํ ๊ฒ์ด ์๋๋๋ค. ์ ์๋๋ ์ ๊ฐ ๋ณธ ๋ช ๊ฐ์ง ์คํด๋ฅผ ๋ช ํํํ๊ณ ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ๊ตฌ์ฑํ๋์ง ์ค๋ช ํ๋ ๊ฒ์ ๋๋ค.
InvariantCulture๊ฐ ์ง์ ๋์ด ์์ด๋ ICU ๋ฒ์ ์์ \n
๊ฐ ์ผ์นํ์ง ์๋ ๊ฒ์ด ์ฌ๋ฐ๋ฅธ ๋์์
๋๊น?
์๋ง๋ ๋ค์ ์ฝ๋๋ git ๋ฐ ๊ธฐ๋ณธ ์ค์ (autocrlf = true)์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ Linux์์ 5, Windows์์ -1์ ํ์ํฉ๋๊น?
using System;
var s = @"hello
world";
Console.WriteLine(s.IndexOf("\n", StringComparison.InvariantCulture));
@ufcpp ์,์ด ์ค๋ ๋์ ์๋ถ๋ถ์์ ์ค๋ช
ํ๋๋ก ์์๋๋ ๋์ ์ธ ICU ๋น. 2 ๊ฐ์ ๋ฌธ์ <CR><LF>
๋ ์๋ก ์ธ์ ํด์์ ๋ ์ธ์ด ๋ชฉ์ ์ ๊นจ์ง์ง ์๋ ๋จ์๋ก ๊ฐ์ฃผ๋ฉ๋๋ค. ์ธ์ด ๋น๊ต ์ (์ : _InvariantCulture_)๋ฅผ ์ฌ์ฉํ์ฌ <LF>
๋ฅผ ๊ฒ์ํ๋ฉด์ด ๊นจ์ง์ง ์๋ ๋จ์๋ฅผ ๋ถํ ํ๋ฏ๋ก ์ผ์นํ๋ ํญ๋ชฉ์ด ์์ฑ๋์ง ์์ต๋๋ค.
๋ชจ๋ ์ฌ๋๊ณผ ์ ๋ฐ์ดํธ๋ฅผ ๊ณต์ ํ๊ณ ์ถ์ต๋๋ค. ICU๋ฅผ 5.0 GA์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ ์งํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. https://github.com/dotnet/runtime/issues/43956 ์์ ์ถ์ ๋๋ ์์๋ฅผ ์๋ํ์ ๋ ์ค์๋ก ์ธ์ด ๋น๊ต๋ฅผ ์ฌ์ฉํ๋ ํจ์ ์ ๊ฐ์ ํ๋ ๋ฐฉ๋ฒ์ ์ดํด ๋ณด๊ฒ ์ต๋๋ค
์ด๊ฒ์ ๋งค์ฐ ์ด๋ ค์ด ๊ฒฐ์ ์ด์๊ณ , ํ๋ซํผ ๊ฐ ํ์คํ๋ฅผ์ํ ๋๋ผ์ด๋ธ์ ์ํ๊ณ์ ๋ฏธ์น๋ ํธํ์ฑ ์ํฅ์ ๋น๊ตํด์ผํ์ต๋๋ค.
ํ์ฌ ์ํ ์กฐ์น๊ฐ ๋ถ์ถฉ๋ถํ๋ค๊ณ ํ๋จ๋๋ ๊ฒฝ์ฐ ์๋น์ค์ \r\n
๋ฌธ์ ์ ๋ํ ์ถ๊ฐ ์ํ๋ฅผ ๊ณ ๋ คํ๊ธฐ ์ํด์ด ๋ฌธ์ ๋ฅผ ์ด์ด ๋๊ฒ ์ต๋๋ค.
๋๋ ๋ํ ์ฌ๋๋ค์ด ICU ์ค์์น์ ๊ฒฐ๊ณผ๋ก ๋ฐ์ํ๋ ๋ฌธ์ ๋ฅผ ๊ณ์๋ณด๊ณ ํ๋๋ก ์ฅ๋ คํ๊ณ ์ถ์ต๋๋ค. ๋น๋ก ๊ทธ ๋์์ด ์๋ ค์ง ์์ธ ์ผ ์ ์์ง๋ง ๊ทธ๊ฒ์ด "์ค๊ณ์ ์ํ"๊ฒ์ ์๋๋๋ค. ์ฐ๋ฆฌ๋ ๊ณ์ํด์ ์ฐจ์ด์ ์ ์กฐ์ฌํ๊ณ ๊ทผ๋ณธ ์์ธ์ ์ดํดํ๊ณ ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ICU ๋๋ .NET์ผ๋ก ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฉํด์ผํ๋์ง ๊ฒฐ์ ํ ๊ฒ์ ๋๋ค.
ํญ์ StringComparison์ ์ง์ ํ๋ ๋ถ์๊ธฐ ๊ท์น์ด ์์ต๋๋ค.
https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1307
๋ชจ๋ ์ฌ๋๊ณผ ์ ๋ฐ์ดํธ๋ฅผ ๊ณต์ ํ๊ณ ์ถ์ต๋๋ค. ICU๋ฅผ 5.0 GA์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ ์งํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ์์๋ฅผ ์๋ํ์ ๋ ์ฐ์ฐํ ์ธ์ด ๋น๊ต๋ฅผ ์ฌ์ฉํ๋ ํจ์ ์ ๊ฐ์ ํ๋ ๋ฐฉ๋ฒ์ ์ดํด ๋ณด๊ฒ ์ต๋๋ค. ์ด๋ # 43956์์ ์ถ์ ๋ฉ๋๋ค. ๋ํ์ด ๋ฌธ์ ์ ์ํฅ์๋ฐ์ ๊ฒ์ผ๋ก ํ์ธ ๋ ์ผ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฐ๋ฝ ํ ๊ฒ์ ๋๋ค. ์์ผ๋ก ๋ค๊ฐ์ค๋ 5.0 ๋ฆด๋ฆฌ์ค์ ํจ๊ป ์ฌ๋๋ค์ด ๋ฌธ์ ๊ฐ์๋ ์ฝ๋๋ฅผ ๋ ์ ์๋ณํ๊ณ ์ด ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์์ ํ๋ ๋ฐ ๋์์ด ๋ ๋ ๋ง์ ๋ฌธ์๋ฅผ ๊ณต์ ํ ๊ฒ์ ๋๋ค.
์ด๊ฒ์ ๋งค์ฐ ์ด๋ ค์ด ๊ฒฐ์ ์ด์๊ณ , ํ๋ซํผ ๊ฐ ํ์คํ๋ฅผ์ํ ๋๋ผ์ด๋ธ์ ์ํ๊ณ์ ๋ฏธ์น๋ ํธํ์ฑ ์ํฅ์ ๋น๊ตํด์ผํ์ต๋๋ค.
ํ์ฌ ์ํ ์กฐ์น๊ฐ ๋ถ์ถฉ๋ถํ๋ค๊ณ ํ๋จ๋๋ ๊ฒฝ์ฐ ์๋น์ค์
\r\n
๋ฌธ์ ์ ๋ํ ์ถ๊ฐ ์ํ๋ฅผ ๊ณ ๋ คํ๊ธฐ ์ํด์ด ๋ฌธ์ ๋ฅผ ์ด์ด ๋๊ฒ ์ต๋๋ค.๋๋ ๋ํ ์ฌ๋๋ค์ด ICU ์ค์์น์ ๊ฒฐ๊ณผ๋ก ๋ฐ์ํ๋ ๋ฌธ์ ๋ฅผ ๊ณ์๋ณด๊ณ ํ๋๋ก ์ฅ๋ คํ๊ณ ์ถ์ต๋๋ค. ๋น๋ก ๊ทธ ๋์์ด ์๋ ค์ง ์์ธ ์ผ ์ ์์ง๋ง ๊ทธ๊ฒ์ด "์ค๊ณ์ ์ํ"๊ฒ์ ์๋๋๋ค. ์ฐ๋ฆฌ๋ ๊ณ์ํด์ ์ฐจ์ด์ ์ ์กฐ์ฌํ๊ณ ๊ทผ๋ณธ ์์ธ์ ์ดํดํ๊ณ ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ICU ๋๋ .NET์ผ๋ก ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฉํด์ผํ๋์ง ๊ฒฐ์ ํ ๊ฒ์ ๋๋ค.
๋ด๊ฐ ์ ์ด ํ ์์๋ .NET Standard ์ข ์์ฑ์ ๊ณ์ ์ฌ์ฉํ ์ ์๋์ง ์๊ณ ์ถ์ต๋๋ค.
๋๋ ํ ์ ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ค. ์ฌ๋๋ค์ด .NET Standard 2.2๋ก ์ ํํ๋๋กํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น? API๋ฅผ ๋ณ๊ฒฝ ํ์๊ฒ ์ต๋๊น?
์์๋๋ ๋์์ ์ป๋๋ค๋ ์ฌ์ค์ ์ ์ ์์ต๋๋ค.
์ด๋ฏธ ๊ณต์ ํ ๋ชซ์ ์ฐจ์งํ๊ณ ์๋ ํ์ฌ ์ํ๊ณ์ ํ๊ดด๋ฅผ ์ด๋ป๊ฒ ํผํ ์ ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๋๋ ํ๋ ธ๋ค๋ ๊ฒ์ด ์ฆ๋ช ๋์ด ๊ธฐ์ ๊ฒ์ ๋๋ค. ํธ๊ฒฌ์ ๊ฐ์ง๊ณ ๊ทธ๋ ๊ฒ ํด์ฃผ์ธ์-๊ทธ๊ฒ์ ๋ด ๋ง์์ ํธ์ํ๊ฒ ํ ๊ฒ์ ๋๋ค :)
๋ฟก๋ฟก
๋ด๊ฐ ์ ์ด ํ ์์๋ .NET Standard ์ข ์์ฑ์ ๊ณ์ ์ฌ์ฉํ ์ ์๋์ง ์๊ณ ์ถ์ต๋๋ค.
.Net Standard ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ผ๋ฐ์ ์ผ๋ก ํฌ๋ก์ค ํ๋ซํผ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค. ์ผ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ์ฌ Unix์ .Net Core 3 (ICU ์ฌ์ฉ)์์ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋ค๋ฉด Windows (ICU๋ ์ฌ์ฉํ๋)์ .Net 5์์๋ ๊ฑฐ์ ํ์คํ๊ฒ ์๋ํฉ๋๋ค.
.NET ํ์ค 2.2
.Net Standard vNext๋ ".Net 5.0"์ด๋ผ๊ณ ํ์ง๋ง ํจ๊ณผ์ ์ผ๋ก ์กด์ฌํฉ๋๋ค. (์ฆ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ฑ ์ค์ด๊ณ ์ด์ ํ๋ ์ ์ํฌ๋ฅผ ์ง์ํ๋ ๋ฐ ์ ๊ฒฝ ์ฐ์ง ์๋ ๊ฒฝ์ฐ, ์ค๋์ .Net Standard 2.1์ ๋์์ผ๋กํฉ๋๋ค. ํ ๋ฌ ์์ .Net 5.0์ ๋์์ผ๋กํฉ๋๋ค.)
@svick ์๊ฒ ์ต๋๋ค . .NET Standard์ ์๋ ๋ฐฉ์์ ์ด๋ฏธ ์ดํดํ๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ .NET 5๊ฐ ์๋ก์ด .NET ํ์ค์ด๋ผ๋ ๊ฒ์ ์ดํดํฉ๋๋ค.
์ฃ์กํ์ง๋ง IndexOf์ Contains ์ฌ์ด์ ๊ธฐ์กด ๋์ ๋ถ์ผ์น์ ์์กดํ๋ .NET Standard 2.1 ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐธ์กฐํ๋ฉด ์ด๋ป๊ฒ๋๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์ฌ๊ธฐ์ ๋ณํํ๋ ๊ฒ์ ๋์ญ ์ธ, ICU ๋ NLS์
๋๋ค. ์ด ๋ณํ๋ ์ฐ๋ฆฌ๊ฐ ์ด๋ฏธ ๊ฐ์ง๊ณ ์๋ ๋ถ์ผ์น๋ฅผ ๋ํ๊ณ ๊ธฐ๋์น๋ฅผ ๊นจ๋จ๋ฆฝ๋๋ค.
์ด ์ ๋ณด๋ฅผ libs๋ก ์ธ์ฝ๋ฉํ๋ ๊ฒ์ ์์ต๋๋ค.
๋ชจ๋ ์๋ฏธ๋ฅผ ์ดํดํ๋ค๊ณ ์๊ฐํ์ง๋ ์์ง๋ง ์๋ก์ด ๋ ธ๋ฉ์ ๋ํ ์ํํ ์จ ๋ณด๋ฉ ๊ฒฝ๋ก ์์ด๋ "๊ธฐ์ ์ ์ผ๋ก ์ ํ"ํ๋ค๋ ๋๋์ ๋จ์ณ ๋ผ ์ ์์ต๋๋ค. ์ ์คํ ํ์ํฉ๋๋ค.
๋ค๋ฅธ ๋๊ตฐ๊ฐ๊ฐ ์ธ๊ธํ๋ฏ์ด, ๋๋ถ๋ถ์ ์ฌ๋๋ค์ ์ต๊ณ ์ ์ปค๋ฎค๋ํฐ ๊ตฌ์ฑ์์ด ๋ฌด์์๋ก ๋ฐ๊ฒฌ ํ ๊ฒ๊ณผ ๊ฐ์ ์ง์ง ๋ณํ๋ ๋งํ ๊ฒ๋์๊ณ ์๋ก์ด ์ธ์ด ๊ธฐ๋ฅ๋ ์ธ์ํ์ง ๋ชปํฉ๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ด๊ฒ์ ๊ฒฌ๋ ์์๋ ๊ธฐํ๋ ๋ฌด์์ ๋๊น?
๋ด๊ฐ ์ ์ด ํ ์์๋ .NET Standard ์ข ์์ฑ์ ๊ณ์ ์ฌ์ฉํ ์ ์๋์ง ์๊ณ ์ถ์ต๋๋ค.
์ฌ๊ธฐ์ ๋ณํํ๋ ๊ฒ์ ๋์ญ ์ธ, ICU ๋ NLS์ ๋๋ค. ์ด ๋ณํ๋ ์ฐ๋ฆฌ๊ฐ ์ด๋ฏธ ๊ฐ์ง๊ณ ์๋ ๋ถ์ผ์น๋ฅผ ๋ํ๊ณ ๊ธฐ๋์น๋ฅผ ๊นจ๋จ๋ฆฝ๋๋ค.
์๋์, ๊ทธ๋ ์ง ์์ต๋๋ค. ICU๊ฐ ์ ๋์ค์์ _ ํญ์ _ ์ฌ์ฉ๋์ด ์๋ค๋ ๊ฒ์ ์ฌ๊ธฐ์ ์ถฉ๋ถํ ๊ฐ์กฐ ํ ์ ์์ต๋๋ค. .NET Standard ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ค๊ณ ์ ์ด์ ๊ฐ๋ฅํด์ผํ๋ฉฐ ์ด์ ์ Linux .NET Core 3.x์์ ์๋ํ๋ ๋ชจ๋ ๊ฒ์ด .NET 5์์ ์๋ํฉ๋๋ค.
์ฐ๋ฆฌ๊ฐํ๋ ๋๋ถ๋ถ์ ์์ ์ InvariantCulture์ ๋๋ค. ์ ๊ฐ ์ด์ ์ ์ดํด ํ ๋ฐ์ ๋ฐ๋ฅด๋ฉด ์ค๊ณ ์ ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค.
์ฌ์ค์ด ์๋๋ค. InvariantCulture๋ ์ฌ์ฉ์์ ์ธ์ด ์ค์ ๋ง ๋ฌด์ํ๋๋ก๋์ด ์์ต๋๋ค. ์ ๋ ์ฝ๋ ์ฌ์์ด๋ ์ธ๊ณํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฑ์ ๋ํ ์ ๋ฐ์ดํธ๋ก ์ฌ์ ํ ๋ณ๊ฒฝ ๋ ์ ์์ต๋๋ค.
.NET ํ์ ์ด๋ก ์ธํด ๋ฐ์ํ ์์๋ ๊ณ ํต๊ณผ ๋ฌธ์ ์ ๋ฐ ๋น์ฉ์ ๊ณ ๋ ค ํ์ต๋๊น?
์ด์ ๊ฐ์ ๋ฐ์ธ์ ๋์ด ์์ต๋๋ค. ์ด ๋ณ๊ฒฝ์ผ๋ก ๊ฐ์๊ธฐ ์ค๋จ๋๋ ์ฝ๋๋ ์ฒ์๋ถํฐ ์๋ชป๋์์ต๋๋ค. .NET ํ์ด ์ฌ๋ฐ๋ฅด์ง ์๊ฑฐ๋ ๊ตฌํ ์ธ๋ถ ์ฌํญ์ ์์กดํ๋ ์ฌ์ฉ์ ์ฝ๋์ ๋์์ ์ ์งํด์ผํ๋ ๊ฒฝ์ฐ ํ๋ซํผ์ ์ด๋ป๊ฒ ๋ฐ์ ํด์ผํฉ๋๊น? ํธํ์ฑ ์ค์์น๋ฅผ ์ ๊ณตํ์ง ์์ ๊ฒ๊ณผ๋ ๋ค๋ฆ ๋๋ค. .NET Core๊ฐ .NET Framework์์ ๋ถ๋ฆฌ ๋ ์ด์ ์ ํฐ ๋ถ๋ถ์ side-by-side ์ค์น ๋ฐ ์ฑ-๋ก์ปฌ ๋ฐํ์ ๋ฐฐํฌ์ ๊ฐ์ ๊ธฐ๋ฅ์ ํตํด์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์์์ต๋๋ค. ์ด ๋๋ฌธ์ .NET 5๋ก ์ด๋ํ ์ ์๋ค๋ฉด .NET 5๋ก ์ด๋ํ์ง ๋ง์ญ์์ค.
.NET 5๊ฐ ์๋ ค์ง์ง ์์ ์๋ ค์ง์ง ์์ ์๋ก์ด ์๋ฌผ์ ๋์ ํ๊ณ ๋ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฟ๋ง ์๋๋ผ ๋ค์ด ์คํธ๋ฆผ ์ข ์์ฑ์ ๋ํ ์์ ์ฌํญ์ ๋ค์ ๊ฒํ ํ ๊ฒ์ด๋ผ๋ ์ ๋ง์ ํฅ๋ถํ์ง ์์ต๋๋ค.
์ฃผ์ฅํ๋๋๋ก ํ๋ซํผ ์ฐจ์ด ๋ฒ๊ทธ๋ฅผ ๋ชจ๋ ์ ๊ฑฐํ๋ค๋ฉด ๊ฑฑ์ ํ ํ์๊ฐ ์์ต๋๋ค.
.NET ํ์ ์ด๋ก ์ธํด ๋ฐ์ํ ์์๋ ๊ณ ํต๊ณผ ๋ฌธ์ ์ ๋ฐ ๋น์ฉ์ ๊ณ ๋ ค ํ์ต๋๊น?
์ด์ ๊ฐ์ ๋ฐ์ธ์ ๋์ด ์์ต๋๋ค.
์๋ฐฑ๋ง ๊ฐ์ ํ๋ก์ ํธ๊ฐ .NET์์ ์คํ๋๊ณ ์์ผ๋ฉฐ ๋ฌธ์์ด ์กฐ์์ ๋งค์ฐ ๋น๋ฒํ ์์
์
๋๋ค.
.NET ํ์ด์ด ๋ฌธ์ ๋ฅผ ์์ / ๋ณ๊ฒฝํ๋ ๋ฐ ๋๋ ๋
ธ๋ ฅ์ .NET 5/6์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์
๋ ๋ชจ๋ ๊ธฐ์กด ์ฝ๋๋ฅผ ํ์ธํ๋ ๋ฐ ํ์ํ ๋
ธ๋ ฅ์ ๋นํด ์์ฃผ ์ ์ต๋๋ค.
๋ฐ๋ผ์์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ์ํ "๊ณํ"์ ๋ํด ๋ฌผ์ด ๋ณด๋ ๊ฒ์ ์๋นํ ๊ณต์ ํฉ๋๋ค.
๊ณํ์ด ์์ต๋๊น?
์ด ๋ณ๊ฒฝ์ ํจ๊ณผ๊ฐ ์์ ๋์์ต๋๊น?
๋ชจ๋ ํ๋ก์ ํธ์ 0.001 %์
๋๊น? 75 %์
๋๊น?
์ฐ๋ฆฌ๊ฐ ์์ง ๋ชปํ๋ ๋ค๋ฅธ ์ ์ฌํ ๋ณํ๋ ๋ฌด์์
๋๊น?
์ด๊ฒ์ ์์์ ํ๋ก์ ํธ์๋ง ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ถ์ ๋์์ต๋๊น?
BTW, ๋๋ ์ถฉ๋ถํ ์ด์ ๋ฅผ ๊ณ ๋ คํ ๋ ๋ณ๊ฒฝ ์ฌํญ์ ๊นจ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋๋ฌด ์ํํ์ง ์์ ๋ง์ด๊ทธ๋ ์ด์ ๊ฒฝ๋ก๋ ํ์ํฉ๋๋ค.
@petarrepac ์คํด ํ์ง ๋ง์ญ์์ค. ๊ทธ๋ฌ๋์ด ์ค๋ ๋์์ ์ฌ๋ฌ ๋ฒ ์ง์ ํ๋ฏ์ด :
๋ง์ง๋ง ๋ ๊ฐ์ง ์ ์ ๊ฐ์ํ ๋ ์ด๊ฒ์ด ์๋นํ ์ ์ ๋น์จ์ ํ๋ก์ ํธ์ ์ํฅ์ ๋ฏธ์น๋ค๊ณ ๊ฐ์ ํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ผ ๊ฒ์ ๋๋ค.
100 % ์ด๊ฒ์ ๋ํด ๋ฌผ์ด ๋ณด๋ ๊ฒ์ ๊ณตํํ์ง๋ง, ์ ๊ฐ ์ธ์ฉ ํ ๊ฒ๊ณผ ๊ฐ์ ๋๊ธ์ ์์ฑํ๋ ์ฌ๋๋ค์ ์ข ์ข ๋ณํ์ ๋ ํฐ ๊ทธ๋ฆผ์ ์ดํดํ๋ ค๊ณ ์๋ํ๊ธฐ ์ ์ ๊ณ ๋ คํ์ง ์๊ณ ์์ฑํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
๋ชจ๋๋ค ์๋ . ์ด ๋ฌธ์ ๊ฐ ๊ณต๊ฐ๋์์ ๋ ์ทจํ ์กฐ์น์ ๋ง์ง๋ง์ Windows 10 2019 ๋ 5 ์ ์ ๋ฐ์ดํธ ์ด์์์ ๊ธฐ๋ณธ๊ฐ์ .NET 5.0 ์ฉ ICU๋ก ์ ์งํ๊ธฐ๋ก ๊ฒฐ์ ํ ์ด์ ์ ๋ํ ๊ฐ๋ตํ ์์ฝ์ ์ ๊ณตํ๊ณ ์ํฉ๋๋ค.
๋ฌธ์ ๊ฐ ์์๋์์ ๋ ์ฐ๋ฆฌ๋ Ordinal
์ IndexOf(string)
์ฌ์ด์ ๋ถ์ผ์น๋ฅผ ๊ฐ์ํ ๋ ๊ณ ๊ฐ์๊ฒ ๋ฏธ์น ์์๋ ์ ์ฌ์ ์ธ ์ํฅ๊ณผ ๊ณ ํต์ ๋ํ ๋ด๋ถ ํ ๋ก ์ ์์ํ์ต๋๋ค Contains(string)
IndexOf(string)
๋ฌธํ ์ธ์ํ๊ณ , ํ๋ฌ์ค ๋ฌธ์์ด์ ํตํด ์๋ ํ ๋ ๋ค๋ฅธ API๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฌธํ ์ธ์ํ๊ณ ๊ฐ์ง๊ณ ์์ง๋ง, ์ธ Ordinal
ํตํด ์๋ ํ ๋ Span<char>
๋๋ ReadOnlySpan<char>
. ๋ฐ๋ผ์์ด ๋ฌธ์ ์ ๋ํด ๋
ผ์ํ ํ ์ํฅ์๋ฐ์ ์์๋ NuGet ํจํค์ง์ ๋ํ ๋ถ์์ ์์ํ๊ณ ๋ช
ํํ ๊ทธ๋ฆผ์ ์ป๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฅผ ์์งํ์ต๋๋ค. ์ด๊ฒ์ด ์ฐ๋ฆฌ์ ๊ฒฐ๊ณผ์
๋๋ค.
์ํ์ ์ฒํ ํธ์ถ ์ฌ์ดํธ๊ฐ์๋ ์ด๋ฌํ 2040 ํจํค์ง ์ค 539 ๊ฐ๋ง .NET Standard ๋๋ .NET Core์ ์ผ๋ถ ๋ฒ์ ์ ์ง์ํ๋ฏ๋ก NuGet.org์ ๋์ด๋ 0.54 % ํจํค์ง ๋ง ์ค๋จ์ ๋ ธ์ถ ๋ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.
์ ์ฌ์ ์ผ๋ก ์ํฅ์๋ฐ์ ์์๋ 539 ๊ฐ์ ํจํค์ง ID ๋ชฉ๋ก์์ ํจํค์ง๋ฅผ ์ดํด๋ณด๊ณ ์ค์ ์ํฅ์ ๋ํ ์์ด๋์ด๋ฅผ ์ป์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์์ 70 ๊ฐ (๋ค์ด๋ก๋ ์ ๊ธฐ์ค)๋ฅผ ์ดํด ๋ณด์๊ณ , 20 ๊ฐ๋ ์ต์ ๋ฒ์ ์์ ํจํด์ ๋ ธ์ถํ์ง ์์์ผ๋ฉฐ, ํจํด์ ๋ ธ์ถ ํ ํจํด์ ํ์ฉ ๋ผ์ด์ ์ค๊ฐ์๋ 32 ๊ฐ๋ง ๋ณผ ์์์์ต๋๋ค.
์ฆ, ๋ค์ด๋ก๋ ๊ธฐ์ค ์์ 70 ๊ฐ ํจํค์ง ์ค 18 %๋ง์ด ์ ์ฌ์ ์ผ๋ก ์ํฅ์ ๋ฐ์์ต๋๋ค.
์ด๋ฌํ ๋ฐฑ๋ถ์จ์ ๋์ ๋๋ฉฐ NuGet.org์ ์ด ํจํค์ง ์์ธ 229,536 ๊ฐ์ ๋น๊ต๋์ง ์์ต๋๋ค. ๋ฐ๋ผ์ NuGet.org์์ ์ด ํจํค์ง ์์ ์ด ๋ค์ด๋ก๋ ์๋ฅผ ์ฌ์ฉํ๋ฉด 0.24 % ์ธ 229,536 ๊ฐ ์ค ์ ์ฌ์ ์ผ๋ก ์ํฅ์๋ฐ๋ 539 ๊ฐ์ ํจํค์ง๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ถ์ํ๋ ๊ฒ์ ์ข์ง๋ง nuget์ C # ์ฝ๋์ ๊ทนํ ์ผ๋ถ์ ๋ถ๊ณผํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๊ตฐ๊ฐ๊ฐ ์ฝ๋๋ฅผ ์์ ํ๊ณ ์๋๋ผ๋ a) ๋ฒ๊ทธ๋ฅผ ์ถ์ ํ๊ธฐ๊ฐ ์ฝ์ง ์์ ์ ์์ผ๋ฉฐ b) ๋ ์ด์ ์์ค๋ฅผ ๊ฐ์ง๊ณ ์์ง ์์ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ด๊ฒ์ ๋์์์์ด ๋งค์ฐ ์ฃผ๋ชฉํ ๋งํ ๋ณํ ์ผ ์ ์์ง๋ง Windows Line Endings (ํํ์ง ์์ ์๋ ์์)๋ฅผ ํฌํจ ํ ์์๋ ์ ๋ ฅ์ ์ฝ์ ๋ ์ด๋ฏธ Unix์์ ๋ฐ์ํ ์ค๋จ์ด๋ผ๋ ๊ฒฐ๋ก ์ ๋ด๋ฆด ์์๋ ์ข์ ๋ฐ์ดํฐ ์์ค์์ต๋๋ค.
.NET Core ๋ฐ .NET 5+์์ ์ฐ๋ฆฌ๋ OS ๊ฐ์ ์ผ๊ด์ฑ์ ์ํด ๋ ธ๋ ฅํ๊ณ ์์ผ๋ฉฐ์ด ๋ณ๊ฒฝ์ ์ํฅ์ ๊ณ ๋ คํ ๋ ์ฌ๋ฐ๋ฅธ ์์ ์ฒ๋ผ ๋๊ปด์ก์ต๋๋ค. ์ฐ๋ฆฌ๋ ํธํ์ฑ์ ๊ด์ฌ์ด ์์ผ๋ฏ๋ก ์ฌ๋๋ค์ด ๋ ๊ฑฐ์ ๋์์ผ๋ก ๋์๊ฐ ์ ์๋๋ก ํธํ๋๋ ๋ฐํ์ ์ค์์น๋ฅผ ์ ๊ณตํ๊ณ ์์ต๋๋ค.
๋ํ ์ฐ๋ฆฌ๊ฐ ๊ฒ์ฌ ํ ์์๋ ํจํค์ง์ ๊ฒฐ๋ก ์ ์ด๋ฏธ Unix์์ ๋์์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์์ด ๋ฌธ์ ์ ๋ํ ๋ฐฉ์ด์ ์ธ ํ๋ก๊ทธ๋๋ฐ์ ๋ง์ด ํ์ธํ์ฌ OS ๊ฐ ์ ์ฌ์ ์ธ ์ค๋จ์ ์ํํ์ต๋๋ค.
์ฌ๊ธฐ์ ๋ง๋ถ์ฌ์, ์ธ๊ณํ๋ ์ฐ๋ฆฌ๊ฐ OS ์ ๋ฐ์ ๊ฑธ์ณ ์์ ๋ํผ์ด๊ธฐ ๋๋ฌธ์ ์ธ์ ๋ ์ง ๋ณ๊ฒฝ ๋ ์ ์์ผ๋ฏ๋ก ํ์ฌ ์ฐ๋ฆฌ๊ฐ ์ง์ํ๋ ๋ชจ๋ OS์์ ๋์ผํ ๋ํผ๊ฐ๋๋ ๊ฒ์ด ์ณ์ ๊ฒ์ฒ๋ผ ๋๊ปด์ก์ต๋๋ค.
๊ทธ ์ผํ์ผ๋ก ์ค์ ์์ , roslyn ๋ถ์๊ธฐ ๊ท์น ๋ฐ ์ํฅ์๋ฐ๋ ์ฝ๋๊ฐ์ด๋ฅผ ์ํ ํ ์์๋ ๋ฐฉ๋ฒ์ผ๋ก ๋ฌธ์๋ฅผ ๊ฐ์ ํ์ต๋๋ค.
ํญ์ ์ฐ๋ฆฌ๋ฅผ ๋ ๋์ ๊ณณ์ผ๋ก ๋ฐ๋ ค๊ฐ๋ ๊ท์คํ ํผ๋๋ฐฑ์ ๊ฐ์ฌ ๋๋ฆฌ๋ฉฐ, https://github.com/dotnet/runtime/issues/43956์์ ๋ ผ์ ๋๋๋ก .NET 6์ ๋ํ์ด ๊ฒฝํ์ ๊ณ์ ๊ฐ์ ํ๊ธฐ ์ํด ๋ ธ๋ ฅํ ๊ฒ์ ๋๋ค.
Unix์ Windows์์ ์ค ๋์ ์ฐจ์ด๋ก ์ธํด ๋ฐ์ํ ์์๋ ๊ณ ํต์ ์ดํดํ๊ณ ์์ผ๋ฏ๋ก์ด ๋ฌธ์ ๋ฅผ ๊ณ์ ๊ณต๊ฐํ๊ณ .NET 5.0์ \r\n
์ฌ๋ก๋ฅผ ์ํ ํ ์์๋ ๊ฐ๋ฅํ ๋ฐฉ๋ฒ์ ์กฐ์ฌ ํ ๊ฒ์
๋๋ค. .x๋ ์๋น์ค ๋ฆด๋ฆฌ์ค์ ์ผ๋ถ ์ฌ์ผํฉ๋๋ค.
char ๋ฐ string์๋ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
Console.WriteLine("com/test/test/test/a/b/สน$สน".IndexOf("$"));
Console.WriteLine("com/test/test/test/a/b/สน$สน".IndexOf('$'));
24
@mattleibow ๋ฌธ์ ๊ฒ์์ ์ฌ์ฉํ๋ฉด ์์ ๊ฒ์์ ์ํํฉ๋๋ค. This method performs an ordinal (culture-insensitive) search
๋ํ๋ด๋ https://docs.microsoft.com/en-us/dotnet/api/system.string.indexof?view=net-5.0#System_String_IndexOf_System_Char_ ๋ฌธ์. ์์ ์ต์
์ผ๋ก ๋ฌธ์์ด ๊ฒ์์ ์ํํ๋ฉด ๋ฌธ์์ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
C#
Console.WriteLine("com/test/test/test/a/b/สน$สน".IndexOf("$", StringComparison.Ordinal));
~์ด ๋ณด์ธ๋ค CA1307์ ๋จ์ง ํธ๋ฆฌ๊ฑฐ indexof(char)
์์ง๋ง indexof(string)
. string
๋ฒ์ ์ ๋ํ ๊ท์น์ด ์์ต๋๊น? char
์ ๊ธฐ๋ณธ๊ฐ์ด ์๋์ผ๋ก ์์๋ฅผ ์ฌ์ฉํ๊ณ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด ์ค์ ๋ก ์ด์ ์ํฅ์์ฃผ์ง ์๋ ๋ฐ๋ฉด string
์ด ๋ณ๊ฒฝ๋์์ผ๋ฉฐ ๋์์ ๋ณต์ํ๋ ค๋ฉด ์์๋ฅผ ์ง์ ํด์ผํ๊ธฐ ๋๋ฌธ์ ๋ ์ค์ํด ๋ณด์
๋๋ค. ๋ช๋ช ๊ฒฝ์ฐ. ~
~ indexof(string)
๋ ์ด๋ป๊ฒ ๊ฐ์งํฉ๋๊น? ~
์ฐพ์์ต๋๋ค. ๊ท์น CA1310์ ๋๋ค. https://docs.microsoft.com/en-us/dotnet/standard/globalization-localization/globalization-icu#use -nls-instead-of-icu์ ๋ํ ๋ฌธ์๋ ์๋ชป๋์์ผ๋ฉฐ์ด ํน์ ๋ณํ์ ์ธ๊ธํ์ง ๋ง์ญ์์ค. ํด๋น ๋ฌธ์๋ฅผ ์ ๋ฐ์ดํธํ๊ฒ ์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@tarekgh , ๋๋
Contains
์IndexOf
์ฌ์ด์ ๋ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ ๊ทธ ์์ฒด๋ก ๋ฌธ์ ๊ฐ ์๋๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค.๋ฌธ์ ๋ ๋ถ๋ช ํ
IndexOf
๋ก, ๋ค๋ฅธ ASCII ์ ์ฉ ๋ฌธ์์ด ๋ด์์ ํ๋์ ASCII ์ ์ฉ ๋ฌธ์์ด์ ์ฐพ์ ์ ์์ต๋๋ค (ASCII ์ ์ฉ ๋ฌธ์์ด์ ๋ถ๊ณผ ๋ ๋ก์ผ์ผ ์ข ์ ๋์์ด ์๋์ง ํ์คํ์ง ์์ต๋๋ค!).์ด๊ฒ์ ๋ก์ผ์ผ / NLS / ICU ๊ด๋ จ ๋ณ๊ฒฝ์์ ๊ธฐ๋ํ๋ ๊ฒ์ด ์๋๋๋ค. ์ฌ์ค, ๋ค๋ฅธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด / ๋ฐํ์์ด ๊ทธ๋ ๊ฒ ์๋ํ๋ค๊ณ ์๊ฐํ ์ ์์์ต๋๋ค.
๋ค์์ .NET 5 RC 2์์ ๊นจ์ง ๊ฐ๋จํ ํ ์คํธ ์ผ์ด์ค์ ๋๋ค.
์ ๋ง ๊ทธ๋ ๊ฒ ์๋ํ ๊น์? ๋ํ ์? ์ค์ ๋ก ๋ฌด์์ํ๋ ค๊ณ ํฉ๋๊น?
์ฃ์ก ํฉ๋๋ค๋ง ์ด๊ฒ์ด ๊ณํ๋ ๋ณ๊ฒฝ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ๊ทธ๋์ ๊ฐ์กฐํ๊ณ ์ถ์ต๋๋ค. ๋๊ตฌ๋ ๊ทธ๋ฐ ๋ณ๊ฒฝ์ _ ๊ณํ _ํ๋ ๊ฒ์ ์์ํ ์ ์์์ต๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก .NET ํ์ ์ฌ๋๋ค์ด ํจ๊ป ์์ ํ ๋ก ํ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์๋ฌด๋ ๋ถํํ์ง ์์์ต๋๊น? ๊ธฐํ๊ฐ ์๋๋๋ค!
์ด๊ฒ์ ๊ณํ๋๊ฑฐ๋ ์์๋๋ ๋ณ๊ฒฝ์ฒ๋ผ ๋ณด์ด์ง ์๊ณ ๋์ ๋งค์ฐ ์ฌ๊ฐํ ๋ฒ๊ทธ, ํฐ ํธํ์ฑ ์ฐจ๋จ๊ธฐ์ฒ๋ผ ๋ณด์ ๋๋ค. ์ด ๋๋ฌธ์ ์๋กญ๊ณ ์ด์ ๋ .NET ์์ฉ ํ๋ก๊ทธ๋จ์ ์ ๋ฐํ์์์ ์ ๋๋ก ์๋ํ์ง ์์ต๋๋ค. ๋ฌธ์์ด ๋ด๋ถ์์ ํ์ ๋ฌธ์์ด์ ์ฐพ์ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค!
ICU๊ฐ ์ด์ฐจํผ ๋ผ์ธ ์๋ฉ์ ๊ด์ฌ์ด์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ์ผ๋ถ ๋ก์ผ์ผ์๋ ๊ณ ์ ํ ๋ก์ผ์ผ ๋ณ ์ค ๋์ด ์์ต๋๊น?
PS ์, ์์ ํ๋๊ทธ์ ๊ฐ์ด ๋ฌธํ์ ๋ ๋ฆฝ์ ์ธ
IndexOf
๋ณํ์ ํญ์ ํธ์ถํด์ผํ๋ค๊ณ ์ฃผ์ฅ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ .NET 5์์ ์ด์ฌํ _that_ ๊นฐ ์ ์๋ค๊ณ ๊ฒฐ์ ํ๋ค๋ฉด , ์ ์์ ์ธ ์์ ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉํ๋๋ก ๋ง๋ค ์ ์์ต๋๊น? .NET 5 RC 2์์ ๋ณผ ์์๋ ํ์ฌ ๋ณ๊ฒฝ ์ฌํญ๋ณด๋ค ์์ฉ ํ๋ก๊ทธ๋จ์ด ๋ ์ ๊ฒ ์ค๋จ ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.๋ํ
IndexOf
ํญ์ ๋ฌธํ ๋ณ ๋ฐฉ์์ผ๋ก ์๋ํ์ง๋ง ์์ ํ๋๊ทธ์์ดIndexOf
๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋๊ฐ _tons_ ์กด์ฌํ๋ค๋ ๊ฒ์ ์ดํดํ๊ณ ์์ต๋๋ค. _ ์ผํ๋ ๋ฐ ์ต์ ํจ _ (์ ์ด๋ ์ผ๋ถ / ๋๋ถ๋ถ์ ๊ฒฝ์ฐ). ๊ทธ๋ฆฌ๊ณ .NET 5 ์ ๋ฐ์ดํธ ํ ์๋์ด ์ค์ง๋ฉ๋๋ค.