无论使用何种文化,unicode大写字符串的长度是否始终与原始字符串的长度相同?
无论使用何种文化,unicode小写字符串的长度是否始终与原始字符串的长度相同?
换句话说,C#中的以下是真的吗?
text.ToUpper(CultureInfo.CurrentCulture).Length == text.Length
text.ToLower(CultureInfo.CurrentCulture).Length == text.Length
Run Code Online (Sandbox Code Playgroud)
请注意,我对字节数不感兴趣:关于它的问题已经得到解答.
就Unicode标准而言,问题的答案是"否"和"是".
例如,当转换为大写时,"ß"U + 00DF LATIN SMALL LETTER SHARP S通过Unicode映射规则映射到两个字符"SS".可以将其映射到单个字符"ẞ"U + 1E9E LATIN CAPITAL LETTER SHARP S,但这不是默认值(并且根本不常见).另一个例子是"fi"U + FB01 LATIN SMALL LIGATURE FI被映射到"FI".
在相反的方向上,没有可以改变字符数的默认映射.请参阅字符属性,案例映射和名称常见问题解答,它链接到文件SpecialCasing.txt,其中包含与简单一对一映射的所有偏差.那里的唯一规则是使小写字符串与大写原文不同,这是与立陶宛语实践相关的一些可选规则.
我可以给出部分答案。对于所有长度为 2 的字符串(其中大约有 40 亿),并且对于德国文化 ( de-DE),您的断言成立:
static unsafe void TestUnicodeLength2()
{
Parallel.For(char.MinValue, char.MaxValue + 1, charVal =>
{
var firstChar = checked((char)charVal);
var buffer = new string(firstChar, 2);
fixed (char* bufferPtr = buffer)
{
var currentCulture = CultureInfo.CurrentCulture;
for (int i = char.MinValue; i <= char.MaxValue; i++)
{
bufferPtr[1] = checked((char)i);
var toLower = buffer.ToLower(currentCulture);
if (toLower.Length != buffer.Length)
{
Console.WriteLine(buffer + " => " + toLower);
Debugger.Break();
}
var toUpper = buffer.ToUpper(currentCulture);
if (toUpper.Length != buffer.Length)
{
Console.WriteLine(buffer + " => " + toUpper);
Debugger.Break();
}
}
}
});
}
Run Code Online (Sandbox Code Playgroud)
该过程持续约 2 分钟。
我认为这是相当有力的证据,表明断言始终成立,因为通过测试两个字符的所有可能组合,我们会自动测试所有存在的代码点以及没有人会想到的所有奇怪组合。
更新:我后来对总长度为 2560 亿个字符的随机字符串(每个长度为 256 个字符)进行了类似的测试。这些断言仍然成立。
| 归档时间: |
|
| 查看次数: |
599 次 |
| 最近记录: |