C #에서 2 개의 문자열을 비교하고 악센트 부호 문자를 비 액센트 문자와 동일하게 취급해야합니다. 예를 들면 다음과 같습니다.
string s1 = "hello";
string s2 = "héllo";
s1.Equals(s2, StringComparison.InvariantCultureIgnoreCase);
s1.Equals(s2, StringComparison.OrdinalIgnoreCase);
이 두 문자열은 (응용 프로그램과 관련하여) 동일해야하지만이 두 문장은 모두 거짓으로 평가됩니다. C #에 이것을 할 수있는 방법이 있습니까?
답변
2012-01-20 편집 : 오 소년! 이 솔루션은 훨씬 간단했고 거의 영원히 프레임 워크에있었습니다. knightpfhor가 지적한 바와 같이 :
string.Compare(s1, s2, CultureInfo.CurrentCulture, CompareOptions.IgnoreNonSpace);
문자열에서 분음 부호를 제거하는 함수는 다음과 같습니다.
static string RemoveDiacritics(string text)
{
string formD = text.Normalize(NormalizationForm.FormD);
StringBuilder sb = new StringBuilder();
foreach (char ch in formD)
{
UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(ch);
if (uc != UnicodeCategory.NonSpacingMark)
{
sb.Append(ch);
}
}
return sb.ToString().Normalize(NormalizationForm.FormC);
}
MichKap의 블로그 ( RIP … ) 에 대한 자세한 내용 .
원칙은 ‘é’를 2 개의 연속 문자 ‘e’로 바꾸는 것입니다. 그런 다음 문자를 반복하고 분음 부호를 건너 뜁니다.
“héllo”는 “hecute”llo가되며, 차례로 “hello”가됩니다.
Debug.Assert("hello"==RemoveDiacritics("héllo"));
참고 : 다음은 동일한 기능의보다 컴팩트 한 .NET4 + 버전입니다.
static string RemoveDiacritics(string text)
{
return string.Concat(
text.Normalize(NormalizationForm.FormD)
.Where(ch => CharUnicodeInfo.GetUnicodeCategory(ch)!=
UnicodeCategory.NonSpacingMark)
).Normalize(NormalizationForm.FormC);
}
답변
문자열을 변환 할 필요가 없으며 평등을 확인하려는 경우 사용할 수 있습니다
string s1 = "hello";
string s2 = "héllo";
if (String.Compare(s1, s2, CultureInfo.CurrentCulture, CompareOptions.IgnoreNonSpace) == 0)
{
// both strings are equal
}
또는 비교를 대소 문자를 구분하지 않으려면
string s1 = "HEllO";
string s2 = "héLLo";
if (String.Compare(s1, s2, CultureInfo.CurrentCulture, CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase) == 0)
{
// both strings are equal
}
답변
다음 방법 CompareIgnoreAccents(...)
은 예제 데이터에서 작동합니다. 다음은 내 배경 정보를 얻은 기사입니다. http://www.codeproject.com/KB/cs/EncodingAccents.aspx
private static bool CompareIgnoreAccents(string s1, string s2)
{
return string.Compare(
RemoveAccents(s1), RemoveAccents(s2), StringComparison.InvariantCultureIgnoreCase) == 0;
}
private static string RemoveAccents(string s)
{
Encoding destEncoding = Encoding.GetEncoding("iso-8859-8");
return destEncoding.GetString(
Encoding.Convert(Encoding.UTF8, destEncoding, Encoding.UTF8.GetBytes(s)));
}
확장 방법이 더 좋을 것이라고 생각합니다.
public static string RemoveAccents(this string s)
{
Encoding destEncoding = Encoding.GetEncoding("iso-8859-8");
return destEncoding.GetString(
Encoding.Convert(Encoding.UTF8, destEncoding, Encoding.UTF8.GetBytes(s)));
}
그런 다음 사용은 다음과 같습니다.
if(string.Compare(s1.RemoveAccents(), s2.RemoveAccents(), true) == 0) {
...
답변
비슷한 것을하지만 StartsWith 메서드를 사용해야했습니다. 다음은 @Serge에서 파생 된 간단한 솔루션-appTranslator입니다.
확장 방법은 다음과 같습니다.
public static bool StartsWith(this string str, string value, CultureInfo culture, CompareOptions options)
{
if (str.Length >= value.Length)
return string.Compare(str.Substring(0, value.Length), value, culture, options) == 0;
else
return false;
}
그리고 한 라이너 괴물에게는;)
public static bool StartsWith(this string str, string value, CultureInfo culture, CompareOptions options)
{
return str.Length >= value.Length && string.Compare(str.Substring(0, value.Length), value, culture, options) == 0;
}
악센트 인센티브 및 대소 문자 인센티브 시작
value.ToString().StartsWith(str, CultureInfo.InvariantCulture, CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase)
답변
악센트를 제거하는 더 간단한 방법 :
Dim source As String = "áéíóúç"
Dim result As String
Dim bytes As Byte() = Encoding.GetEncoding("Cyrillic").GetBytes(source)
result = Encoding.ASCII.GetString(bytes)
답변
String.Compare 메서드에서이 오버로드를 시도하십시오.
String.Compare 메서드 (String, String, Boolean, CultureInfo)
cultureinfo를 포함한 비교 연산을 기반으로 int 값을 생성합니다. 이 페이지의 예는 en-US 및 en-CZ의 “변경”을 비교합니다. en-CZ의 CH는 단일 “문자”입니다.
링크의 예
using System;
using System.Globalization;
class Sample {
public static void Main() {
String str1 = "change";
String str2 = "dollar";
String relation = null;
relation = symbol( String.Compare(str1, str2, false, new CultureInfo("en-US")) );
Console.WriteLine("For en-US: {0} {1} {2}", str1, relation, str2);
relation = symbol( String.Compare(str1, str2, false, new CultureInfo("cs-CZ")) );
Console.WriteLine("For cs-CZ: {0} {1} {2}", str1, relation, str2);
}
private static String symbol(int r) {
String s = "=";
if (r < 0) s = "<";
else if (r > 0) s = ">";
return s;
}
}
/*
This example produces the following results.
For en-US: change < dollar
For cs-CZ: change > dollar
*/
따라서 강조된 언어의 경우 문화권을 얻은 다음이를 기반으로 문자열을 테스트해야합니다.