/// <summary> /// Calculate all text excluding space (tags are not counted). /// </summary> public decimal CountCharacters(string text, bool forCps) { if (!forCps) { return(new CalcAll().CountCharacters(text, false)); } const char zeroWidthSpace = '\u200B'; const char zeroWidthNoBreakSpace = '\uFEFF'; var length = 0; var ssaTagOn = false; var htmlTagOn = false; var max = text.Length; for (var i = 0; i < max; i++) { var ch = text[i]; if (ssaTagOn) { if (ch == '}') { ssaTagOn = false; } } else if (htmlTagOn) { if (ch == '>') { htmlTagOn = false; } } else if (ch == '{' && i < text.Length - 1 && text[i + 1] == '\\') { ssaTagOn = true; } else if (ch == '<' && i < text.Length - 1 && (text[i + 1] == '/' || char.IsLetter(text[i + 1])) && text.IndexOf('>', i) > 0 && TextLengthHelper.IsKnownHtmlTag(text, i)) { htmlTagOn = true; } else if (!char.IsControl(ch) && ch != ' ' && ch != zeroWidthSpace && ch != zeroWidthNoBreakSpace && ch != '\u200E' && ch != '\u200F' && ch != '\u202A' && ch != '\u202B' && ch != '\u202C' && ch != '\u202D' && ch != '\u202E') { length++; } } return(length); }
/// <summary> /// Calculate all text including space (tags are not counted). /// </summary> public decimal CountCharacters(string text) { if (string.IsNullOrEmpty(text)) { return(0); } const char zeroWidthSpace = '\u200B'; const char zeroWidthNoBreakSpace = '\uFEFF'; var count = 0m; var ssaTagOn = false; var htmlTagOn = false; var max = text.Length; for (var i = 0; i < max; i++) { var ch = text[i]; if (ssaTagOn) { if (ch == '}') { ssaTagOn = false; } } else if (htmlTagOn) { if (ch == '>') { htmlTagOn = false; } } else if (ch == '{' && i < text.Length - 1 && text[i + 1] == '\\') { ssaTagOn = true; } else if (ch == '<' && i < text.Length - 1 && (text[i + 1] == '/' || char.IsLetter(text[i + 1])) && text.IndexOf('>', i) > 0 && TextLengthHelper.IsKnownHtmlTag(text, i)) { htmlTagOn = true; } else if (!char.IsControl(ch) && ch != ' ' && ch != zeroWidthSpace && ch != zeroWidthNoBreakSpace && ch != '\u200E' && ch != '\u200F' && ch != '\u202A' && ch != '\u202B' && ch != '\u202C' && ch != '\u202D' && ch != '\u202E') { if (CalcCjk.JapaneseHalfWidthCharacters.Contains(ch)) { count += 0.5m; } else if (CalcCjk.ChineseFullWidthPunctuations.Contains(ch) || LanguageAutoDetect.JapaneseLetters.Contains(ch) || LanguageAutoDetect.KoreanLetters.Contains(ch) || CalcCjk.IsCjk(ch)) { count++; } else { count += 0.5m; } } } return(count); }
/// <summary> /// Calculate all text except punctuation or space (tags are not counted). /// </summary> public decimal CountCharacters(string text, bool forCps) { const char zeroWidthSpace = '\u200B'; const char zeroWidthNoBreakSpace = '\uFEFF'; var length = 0; var ssaTagOn = false; var htmlTagOn = false; var max = text.Length; for (var i = 0; i < max; i++) { var ch = text[i]; if (ssaTagOn) { if (ch == '}') { ssaTagOn = false; } } else if (htmlTagOn) { if (ch == '>') { htmlTagOn = false; } } else if (ch == '{' && i < text.Length - 1 && text[i + 1] == '\\') { ssaTagOn = true; } else if (ch == '<' && i < text.Length - 1 && (text[i + 1] == '/' || char.IsLetter(text[i + 1])) && text.IndexOf('>', i) > 0 && TextLengthHelper.IsKnownHtmlTag(text, i)) { htmlTagOn = true; } else if (!char.IsControl(ch) && ch != ' ' && ch != '\t' && ch != zeroWidthSpace && ch != zeroWidthNoBreakSpace && ch != '\u200E' && ch != '\u200F' && ch != '\u202A' && ch != '\u202B' && ch != '\u202C' && ch != '\u202D' && ch != '\u202E' && ch != '\u02F8' && // ˸ Modifier Letter Raised Colon (\u02F8) ch != '\uFF1A' && // : Fullwidth Colon (\uFF1A) ch != '\uFE13' && // ︓ Presentation Form for Vertical Colon (\uFE13) ch != '\u2043' && // ⁃ Hyphen bullet (\u2043) ch != '\u2010' && // ‐ Hyphen (\u2010) ch != '\u2012' && // ‒ Figure dash (\u2012) ch != '\u2013' && // – En dash (\u2013) ch != '-' && ch != '\'' && ch != '"' && ch != ':' && ch != '(' && ch != ')' && ch != '{' && ch != '}' && ch != '[' && ch != ']' && ch != '…' && ch != ',' && ch != '.' && ch != '!' && ch != '?' && ch != '¡' && ch != '¿') { length++; } } return(length); }