gpt4 book ai didi

c# - 来自带有特殊表情符号的字符串的子字符串,String.IndexOf 返回 -1

转载 作者:行者123 更新时间:2023-11-30 17:47:48 25 4
gpt4 key购买 nike

我有一个带有特殊表情符号的字符串:

string test = "<textarea style='display:none;'>˃̣̣̥᷄⌓˂̣̣̥᷅  abcde";

我想得到这个字符串的子字符串,如下所示:

string sub = test.Substring(test.IndexOf(">"));

(因为字符串“test”的第一个“>”表示HTML代码结束)

(我要的结果是˃̣̣̥᷄⌓˂̣̣̥᷅abcde)

但是,Substring 方法返回错误(“StartIndex 不能小于 0”),这意味着字符串 'test' 中没有 '>'。

所以我测试了如下内容:

test.Contains(">");

它返回“真”。

这是我的问题:Contains 方法表示字符串 'test' 中包含 '>',但是 Substring 方法无法正常工作。 .

如何从字符串“test”中获取正确的子字符串?

最佳答案

正如其他人所说,IndexOf(">") 执行文化敏感搜索。这意味着您必须记住,存在的字符基本上是不同 unicode 字符的组合。

让我们看看您的字符串的这一部分:;'>˃̣̣̥᷄⌓˂̣̣̥᷅

它包含以下 unicode 字符:

SEMICOLON (U+003B) 
APOSTROPHE (U+0027)
GREATER-THAN SIGN (U+003E)
MODIFIER LETTER RIGHT ARROWHEAD (U+02C3)
COMBINING DOT BELOW (U+0323)
COMBINING DOT BELOW (U+0323)
COMBINING RING BELOW (U+0325)
COMBINING MACRON-ACUTE (U+1DC4)
SEGMENT (U+2313)
MODIFIER LETTER LEFT ARROWHEAD (U+02C2)
COMBINING DOT BELOW (U+0323)
COMBINING DOT BELOW (U+0323)
COMBINING RING BELOW (U+0325)
COMBINING GRAVE-MACRON (U+1DC5)

请注意,虽然它包含一个 GREATER-THAN SIGN (U+003E >)字符,请注意它后面跟着一个 MODIFIER LETTER RIGHT ARROWHEAD (U+02C3 ˃)特点。这个字符是所谓的 spacing modifier letter , 用于更改前一个或后一个字符的含义。

此行为与以下字符(COMBINING DOT BELOWCOMBINING RING BELOW)非常相似,它们是 combining diacritical marks , 但这些通常放在它们修改的字符的顶部或下方(如您在此处看到的那样:̣̣̥᷄⌓,这是一个SEGMENT,由两个DOT BELOW,一个RING BELOW和一个修改MACRON_ACUTE.

因此,如果您考虑组合字符(IndexOf(String) 会这样做),那么您的字符串不包含字符串 >(单个大于号).

要检查单个(非组合)字符,您可以使用 IndexOf('>') (使用 char 而不是 string):

This method performs an ordinal (culture-insensitive) search, where a character is considered equivalent to another character only if their Unicode scalar values are the same.

test.IndexOf(">", StringComparison.Ordinal)


也就是说,如果你想解析 HTML,最好使用像 Html Agility Pack 这样的 HTML 解析器。 :

string html = "<textarea style='display:none;'>˃̣̣̥᷄⌓˂̣̣̥᷅  abcde</textarea>";
HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument();
htmlDoc.LoadHtml(html);
var value = htmlDoc.DocumentNode.SelectSingleNode("//textarea").InnerText;

value 现在包含 ˃̣̣̥᷄⌓˂̣̣̥᷅ abcde

关于c# - 来自带有特殊表情符号的字符串的子字符串,String.IndexOf 返回 -1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24200005/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com