[C#] C #에서 ToUpper ()와 ToUpperInvariant ()의 차이점은 무엇입니까?

C #에서 ToUpper()ToUpperInvariant()? 의 차이점은 무엇 입니까?

결과가 다른 예를들 수 있습니까?



답변

ToUpper현재 문화를 사용합니다. ToUpperInvariant변하지 않는 문화를 사용합니다.

표준 예는 터키이며, “i”의 대문자는 “I”가 아닙니다.

차이점을 보여주는 샘플 코드 :

using System;
using System.Drawing;
using System.Globalization;
using System.Threading;
using System.Windows.Forms;

public class Test
{
    [STAThread]
    static void Main()
    {
        string invariant = "iii".ToUpperInvariant();
        CultureInfo turkey = new CultureInfo("tr-TR");
        Thread.CurrentThread.CurrentCulture = turkey;
        string cultured = "iii".ToUpper();

        Font bigFont = new Font("Arial", 40);
        Form f = new Form {
            Controls = {
                new Label { Text = invariant, Location = new Point(20, 20),
                            Font = bigFont, AutoSize = true},
                new Label { Text = cultured, Location = new Point(20, 100),
                            Font = bigFont, AutoSize = true }
            }
        };
        Application.Run(f);
    }
}

터키어에 대한 자세한 내용은이 터키 테스트 블로그 게시물을 참조하십시오 .

생략 된 문자 등에 대한 다양한 대문자 문제가 있다는 사실에 놀라지 않을 것입니다. 이것은 제가 머리 꼭대기에서 아는 한 가지 예일뿐입니다. -케이싱하고 “MAIL”과 비교합니다. 터키에서는 그다지 효과가 없었습니다 …


답변

존의 대답은 완벽합니다. 방금 ToUpperInvariant을 호출하는 것과 동일 하게 추가하고 싶었습니다 ToUpper(CultureInfo.InvariantCulture).

따라서 Jon의 예제가 조금 더 단순 해집니다.

using System;
using System.Drawing;
using System.Globalization;
using System.Threading;
using System.Windows.Forms;

public class Test
{
    [STAThread]
    static void Main()
    {
        string invariant = "iii".ToUpper(CultureInfo.InvariantCulture);
        string cultured = "iii".ToUpper(new CultureInfo("tr-TR"));

        Application.Run(new Form {
            Font = new Font("Times New Roman", 40),
            Controls = {
                new Label { Text = invariant, Location = new Point(20, 20), AutoSize = true },
                new Label { Text = cultured, Location = new Point(20, 100), AutoSize = true },
            }
        });
    }
}

나는 또한 더 멋진 글꼴이기 때문에 New Times Roman을 사용 했습니다.

속성이 상속 되기 때문에 두 컨트롤 대신 FormFont속성을 설정했습니다 .LabelFont

그리고 소형 (예 : 생산이 아닌) 코드를 좋아하기 때문에 다른 몇 줄을 줄였습니다.

나는 지금 당장 할 일이 낫지 않았다.


답변

MSDN으로 시작

http://msdn.microsoft.com/en-us/library/system.string.toupperinvariant.aspx

ToUpperInvariant 메서드는 ToUpper (CultureInfo.InvariantCulture)와 같습니다.

대문자 i 가 영어로 ‘나’라고 해서 항상 그렇게하는 것은 아닙니다.


답변

String.ToUpper그리고 String.ToLower다른 문화 주어진 다른 결과를 제공 할 수 있습니다. 가장 알려진 예는 터키어 예입니다 . 소문자 라틴어 “i”를 대문자로 변환하면 대문자 라틴어 “I”가 아니라 터키어 “I”가됩니다.

문화, 대문자-소문자, 소문자-대문자에 따라 I의 대문자

나에 관해서는 위의 그림 ( source ) 과 혼동 되어 터키 프로그램의 정확한 결과를 볼 수있는 프로그램 (아래 소스 코드 참조)을 작성했습니다.

# Lowercase letters
Character              | UpperInvariant | UpperTurkish | LowerInvariant | LowerTurkish
English i - i (\u0069) | I (\u0049)     | I (\u0130)   | i (\u0069)     | i (\u0069)
Turkish i - ı (\u0131) | ı (\u0131)     | I (\u0049)   | ı (\u0131)     | ı (\u0131)

# Uppercase letters
Character              | UpperInvariant | UpperTurkish | LowerInvariant | LowerTurkish
English i - I (\u0049) | I (\u0049)     | I (\u0049)   | i (\u0069)     | ı (\u0131)
Turkish i - I (\u0130) | I (\u0130)     | I (\u0130)   | I (\u0130)     | i (\u0069)

보다시피 :

  1. 대문자 소문자와 대문자 소문자는 변하지 않는 문화와 터키 문화에 대해 다른 결과를 제공합니다.
  2. 문화가 무엇이든 대문자와 소문자는 영향을 미치지 않습니다.
  3. Culture.CultureInvariant 터키 문자를 그대로 둡니다
  4. ToUpperToLower그것을 uppercasing 후 문자 lowercasing 즉, 가역적만큼 동일한 배양 하였다 모두 작업에 대해, 원래의 형태로 가져온다.

MSDN 에 따르면 Char.ToUpper와 Char.ToLower의 경우 터키어와 아제르 족은 단일 문자 케이싱 차이가있는 유일한 문화이기 때문에 영향을받는 유일한 문화입니다. 문자열의 경우 더 많은 문화권이 영향을받을 수 있습니다.


출력을 생성하는 데 사용되는 콘솔 응용 프로그램의 소스 코드 :

using System;
using System.Globalization;
using System.Linq;
using System.Text;

namespace TurkishI
{
    class Program
    {
        static void Main(string[] args)
        {
            var englishI = new UnicodeCharacter('\u0069', "English i");
            var turkishI = new UnicodeCharacter('\u0131', "Turkish i");

            Console.WriteLine("# Lowercase letters");
            Console.WriteLine("Character              | UpperInvariant | UpperTurkish | LowerInvariant | LowerTurkish");
            WriteUpperToConsole(englishI);
            WriteLowerToConsole(turkishI);

            Console.WriteLine("\n# Uppercase letters");
            var uppercaseEnglishI = new UnicodeCharacter('\u0049', "English i");
            var uppercaseTurkishI = new UnicodeCharacter('\u0130', "Turkish i");
            Console.WriteLine("Character              | UpperInvariant | UpperTurkish | LowerInvariant | LowerTurkish");
            WriteLowerToConsole(uppercaseEnglishI);
            WriteLowerToConsole(uppercaseTurkishI);

            Console.ReadKey();
        }

        static void WriteUpperToConsole(UnicodeCharacter character)
        {
            Console.WriteLine("{0,-9} - {1,10} | {2,-14} | {3,-12} | {4,-14} | {5,-12}",
                character.Description,
                character,
                character.UpperInvariant,
                character.UpperTurkish,
                character.LowerInvariant,
                character.LowerTurkish
            );
        }

        static void WriteLowerToConsole(UnicodeCharacter character)
        {
            Console.WriteLine("{0,-9} - {1,10} | {2,-14} | {3,-12} | {4,-14} | {5,-12}",
                character.Description,
                character,
                character.UpperInvariant,
                character.UpperTurkish,
                character.LowerInvariant,
                character.LowerTurkish
            );
        }
    }


    class UnicodeCharacter
    {
        public static readonly CultureInfo TurkishCulture = new CultureInfo("tr-TR");

        public char Character { get; }

        public string Description { get; }

        public UnicodeCharacter(char character) : this(character, string.Empty) {  }

        public UnicodeCharacter(char character, string description)
        {
            if (description == null) {
                throw new ArgumentNullException(nameof(description));
            }

            Character = character;
            Description = description;
        }

        public string EscapeSequence => ToUnicodeEscapeSequence(Character);

        public UnicodeCharacter LowerInvariant => new UnicodeCharacter(Char.ToLowerInvariant(Character));

        public UnicodeCharacter UpperInvariant => new UnicodeCharacter(Char.ToUpperInvariant(Character));

        public UnicodeCharacter LowerTurkish => new UnicodeCharacter(Char.ToLower(Character, TurkishCulture));

        public UnicodeCharacter UpperTurkish => new UnicodeCharacter(Char.ToUpper(Character, TurkishCulture));


        private static string ToUnicodeEscapeSequence(char character)
        {
            var bytes = Encoding.Unicode.GetBytes(new[] {character});
            var prefix = bytes.Length == 4 ? @"\U" : @"\u";
            var hex = BitConverter.ToString(bytes.Reverse().ToArray()).Replace("-", string.Empty);
            return $"{prefix}{hex}";
        }

        public override string ToString()
        {
            return $"{Character} ({EscapeSequence})";
        }
    }
}


답변

ToUpperInvariant는 고정 문화권 의 규칙을 사용합니다.


답변

영어에는 차이가 없습니다. 터키 문화에서만 차이를 찾을 수 있습니다.


답변