C#里面中文相關(guān)的測(cè)試
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using NUnit.Framework;
using UnityEngine;
using UnityEngine.TestTools;
namespace Tests
{
public class HanTest
{
public static void LogCharInfo(string str)
{
foreach (var ch in str)
{
var cate = char.GetUnicodeCategory(ch);
Debug.Log($"[{ch}]--{cate}------");
Debug.Log($"IsControl={char.IsControl(ch)}\tIsDigit={char.IsDigit(ch)}\tIsHighSurrogate={char.IsHighSurrogate(ch)}\tIsLetter={char.IsLetter(ch)}");
Debug.Log($"IsLetterOrDigit={char.IsLetterOrDigit(ch)}\tIsLower={char.IsLower(ch)}\tIsLowSurrogate={char.IsLowSurrogate(ch)}\tIsNumber={char.IsNumber(ch)}");
Debug.Log($"IsPunctuation={char.IsPunctuation(ch)}\tIsSeparator={char.IsSeparator(ch)}\tIsSurrogate={char.IsSurrogate(ch)}");
Debug.Log($"IsSymbol={char.IsSymbol(ch)}\tIsUpper={char.IsUpper(ch)}\tIsWhiteSpace={char.IsWhiteSpace(ch)}");
Debug.Log("==============");
}
}
public static void LogSubstringByTextElements(string s)
{
Debug.Log("----------LogSubstringByTextElements------------");
StringInfo strInfo = new StringInfo(s);
for (int i = 0; i < strInfo.LengthInTextElements; i++)
{
Debug.Log($"第[{i}]個(gè)字(文本元素)是[{strInfo.SubstringByTextElements(i, 1)}]");
}
}
public static void LogElements(string s)
{
Debug.Log("-----------------LogElements--------------------");
TextElementEnumerator textElementEnumerator = StringInfo.GetTextElementEnumerator(s);
while (textElementEnumerator.MoveNext())
{
Debug.Log($"文本元素[{textElementEnumerator.GetTextElement()}]的起始index是[{textElementEnumerator.ElementIndex}]");
}
}
public static void LogElementsStartIndex(string s)
{
Debug.Log("-----------LogElementsStartIndex--------------------");
int[] indexArray = StringInfo.ParseCombiningCharacters(s);
for (int i = 0; i < indexArray.Length; i++)
{
Debug.Log($"第[{i}]個(gè)元素记餐,起始index是[{indexArray[i]}]");
}
}
public static void DoTest(string s)
{
Debug.Log("-----DoTest----");
Debug.Log(s);
Debug.Log("=====================");
LogCharInfo(s);
LogSubstringByTextElements(s);
LogElements(s);
LogElementsStartIndex(s);
}
[Test]
public void TestHan()
{
string msg = @" 哈嘍厨疙,大家好,這次的分享是關(guān)于《守望先鋒》(譯注:下文統(tǒng)一簡(jiǎn)稱為Overwatch)游戲架構(gòu)設(shè)計(jì)和網(wǎng)絡(luò)部分袁梗。老規(guī)矩,手機(jī)調(diào)成靜音憔古;離開時(shí)記得填寫調(diào)查問卷;換下半藏淋袖,趕緊推車:枋小(眾笑)
我是Tim Ford,是暴雪公司Overwatch開發(fā)團(tuán)隊(duì)老大即碗。自從2013年夏季項(xiàng)目啟動(dòng)以來就在這個(gè)團(tuán)隊(duì)了焰情。在那之前,我在《Titan》項(xiàng)目組剥懒,不過這次分享跟Titan沒有半毛錢關(guān)系内舟。(眾笑)
這次分享的一些技術(shù),是用來降低不停增長(zhǎng)的代碼庫的復(fù)雜度(譯注初橘,代碼復(fù)雜度的概念需要讀者自行查閱)验游。為了達(dá)到這個(gè)目的我們遵循了一套嚴(yán)謹(jǐn)?shù)募軜?gòu)。最后會(huì)通過討論網(wǎng)絡(luò)同步(netcode)這個(gè)本質(zhì)很復(fù)雜的問題保檐,來說明具體如何管理復(fù)雜性耕蝉。
Overwatch是一個(gè)近未來世界觀的在線團(tuán)隊(duì)英雄射擊游戲,它的主要是特點(diǎn)是英雄的多樣性夜只, 每個(gè)英雄都有自己的獨(dú)門絕技垒在。";
DoTest(msg);
}
[Test]
public void TestUnicode()
{
string msg = "a666\u0304\u0308bc\u0327";
DoTest(msg);
}
[Test]
public void TestEn()
{
string msg = "hello world ! this is 666 !!!";
DoTest(msg);
}
}
}
部分測(cè)試結(jié)果:
image.png
image.png
- 中文通常都是OtherLetter.
-
中文文本元素的長(zhǎng)度直接是String的長(zhǎng)度,也就是說一個(gè)Char就是一個(gè)漢字。
下面是舉例其他某些語言會(huì)導(dǎo)致文字長(zhǎng)度不一致的情況:
image.png
image.png
那么怎么統(tǒng)計(jì)一段文字中的漢字?jǐn)?shù)量扔亥?
方法一场躯、判斷IsLetter為true且是OtherLetter;這個(gè)方法比較粗糙,但也可以在只有中文英文的情況下使用旅挤;
方法二踢关、取出每個(gè)IsLetter為true的Unicode值,并且找到漢字的Unicode范圍谦铃,在這個(gè)范圍內(nèi)才認(rèn)為是一個(gè)漢字耘成;這個(gè)方法相對(duì)精確一些。