Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# String.ToLowerInvariant()如何确定它必须转换为什么字符串/字符?_C#_Unicode - Fatal编程技术网

C# String.ToLowerInvariant()如何确定它必须转换为什么字符串/字符?

C# String.ToLowerInvariant()如何确定它必须转换为什么字符串/字符?,c#,unicode,C#,Unicode,正如我们所知,Unicode的发明是为了解决代码页问题,并代表世界上所有(并非所有,但绝大多数)语言的所有字符。接下来,我们将介绍unicode转换格式-如何以计算机字节表示unicode字符: utf-8一个字符可以占用1到4个字节 utf-16一个字符占用2个字节,或2*2字节=4字节(.NET使用此选项) utf-32一个字符总是需要4个字节(我听说Python使用这个) 到目前为止,好的。下面我们以两种语言为例: 英国的英语(英语GB)和斯洛文尼亚的斯洛文尼亚语(sl SI)。英语有

正如我们所知,Unicode的发明是为了解决代码页问题,并代表世界上所有(并非所有,但绝大多数)语言的所有字符。接下来,我们将介绍unicode转换格式-如何以计算机字节表示unicode字符:

  • utf-8一个字符可以占用1到4个字节
  • utf-16一个字符占用2个字节,或2*2字节=4字节(.NET使用此选项)
  • utf-32一个字符总是需要4个字节(我听说Python使用这个)
到目前为止,好的。下面我们以两种语言为例:

英国的英语(英语GB)和斯洛文尼亚的斯洛文尼亚语(sl SI)。英语有下列字符:a,b,c,d,e。。。x、 y,z。斯洛文尼亚语除了x,y之外还有相同的字符,还有其他字符:č,š,ž。如果我运行以下代码:

Thread.CurrentThread.CurrentCulture = new CultureInfo("sl-SI");
string upperCase = "č".ToUpper(); // returns Č, which is correct based on sl-SI culture

// returns Č, how does it know that it must convert č to Č. 
// What if some other language has character č, and č in that language converts to X.
// How does it determine to what character it must convert?
Thread.CurrentThread.CurrentCulture = new CultureInfo("tr-TR");
string upperCase1 = "č".ToUpperInvariant();
我们可以采取以下措施: 当小写字母“i”移到大写时,它变为“İ”(U+0130“拉丁文大写字母i,上面有点)。类似地,当大写字母“I”移到小写时,它就变成了“ı”(U+0131“拉丁文小写字母无点I”)

如果ToUpperInvariant()决定将“i”转换为土耳其语“İ”,而不是“i”,该怎么办。那就是文化英语。不在这个问题的范围之内,但是,世界上所有语言的每个小写字符都有大写字母吗?我想是的,但如果他们没有,是否有一种语言只有大写字符。是的,我知道我应该从\u+0000到\u+FFFF来测试这个

见备注:

不变的区域性表示一种 文化不敏感它与英语相关但是 与特定的国家或地区无关

并非所有语言都有大写和小写字符,如汉语、日语、印地语、马拉地语等

ToLower在大多数地方与Tolowerin非常相似。这个 文档表明,这些方法只会随着 土耳其文化。此外,在Windows系统上,文件系统是 不区分大小写,这进一步限制了它的使用


不变文化是基于英语的假文化,因此所有“不变”转换都将基于英语

世界上所有语言的每个小写字符都有大写字母吗

不,他们没有。例如,汉语没有大小写的概念

德语有字母
ß
,没有大写版本

考虑:

var germanCulture = new CultureInfo("de-DE");

System.Threading.Thread.CurrentThread.CurrentCulture   = germanCulture;
System.Threading.Thread.CurrentThread.CurrentUICulture = germanCulture;

string s = "ß";

Console.WriteLine(s.ToUpper()); // Prints ß
Console.WriteLine(s.ToLower()); // Prints ß

// Aside: There's a special "uppercase" ß, but this isn't
// returned from "ß".ToUpper();

string t = "ẞ"; // Special "uppercase" ß.

Console.WriteLine(t == s); // Prints false.

Console.WriteLine(s.ToUpper() == t); // Prints false.

(有关奇怪的大写字母
ß
),它不是从
“ß”.ToUpper()
)返回的。

我添加了一些要点:-

  • 不变的文化是文化不敏感的;它与英语相关,但与任何国家/地区无关

  • 通过使用不变的区域性,可以修复字符串表示问题,并且不会因为国家或地区的变化而改变

  • 示例:我们在IST中显示一些日期dd/MM/YYYY,但在EST中,它可能会通过一些异常或获得不同的含义,因此从类似的问题中,我们可以使用不变的概念

    根据报告,案例映射信息的来源如下:

    UnicodeData.txt:包含映射到单个字符的大小写映射。它们不会增加字符串的长度,也不包含上下文相关的映射

    SpecialCasing.txt:包含映射到多个字符的其他大小写映射,例如“ß”到“SS”。还包含与上下文相关的映射,以及一些与区域设置相关的映射,这些映射使用标志将它们与普通映射区分开来

    在中,您将发现:

    0069;LATIN SMALL LETTER I;Ll;0;L;;;;;N;;;0049;;0049
    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
    
    (最后三列包含简单的大写、小写和titlecase映射。)

    因此,除非存在与区域设置相关的异常,否则每个Unicode实现都将使用这些映射,从而导致:

    uppercase(i) = I
    uppercase(č) = Č
    lowercase(Č) = č
    
    档案上说:

    此文件中的条目采用以下机器可读格式:

    ;(;)? # 

    如果列出的所有条件均为真,则条件列表将覆盖正常行为

    对于土耳其语,它包含以下例外情况:

    # When uppercasing, i turns into a dotted capital I
    
    0069; 0069; 0130; 0130; tr; # LATIN SMALL LETTER I
    
    因此,对于土耳其语(和阿塞拜疆语):

    uppercase(i) = İ
    

    立陶宛语也有一些例外。除了这几个例外,大小写映射应该总是相同的,不管.NET“文化”是什么。

    不变的文化是基于英语的假文化。很多语言都没有大写和小写的概念,例如,任何一种中文。我认为你的MS SQL Server测试应该被忽略。我猜它受数据库编码的影响,这意味着它应该属于另一个问题,@matthewatson aha,所以它是英文的。我不知道汉语没有大写/小写的概念,thnx。不是每个小写字符都有大写对应。德语字母
    ß
    仅以小写形式存在。@NHAHDH删除了MS SQL Server测试,正如您指出的,它确实属于上下文/问题。一个相关的怪癖:
    是大写的
    ß
    ,但它的用法不一致,因此映射是单向的(
    )ẞ".ToLower().ToUpper()=“ß”
    )@一二三
    ß
    总是小写的:“德语字母”ß”正字法上只存在于小写字母中,因为它从不出现在单词的开头”但是,有一个特殊的大写版本,
    ,看起来很像@一二三 啊,是的,我已经看到了,但是我误读了你原来的帖子(误读了