Java代码中的表情符号-字符文字中的字符太多
我必须计算给定字符串中的字符数。我将计数保存到地图Java代码中的表情符号-字符文字中的字符太多,java,character,special-characters,Java,Character,Special Characters,我必须计算给定字符串中的字符数。我将计数保存到地图map。该代码不适用于某些特殊符号,如“两颗心”。当我将这样一个特殊的符号转换成一个字符时,就会出现编译器错误“字符文字中的字符太多”或类似错误。为什么会发生这种情况以及如何解决 下面是一些粗略的代码来演示这个问题。这不是完整的代码 import java.util.HashMap; 导入java.util.Map; 公开课演示{ 公共静态void main(字符串[]args){ 字符串twoHeartsStr=” 该代码不适用于某些特殊符号,
map
。该代码不适用于某些特殊符号,如“两颗心”。当我将这样一个特殊的符号转换成一个字符时,就会出现编译器错误“字符文字中的字符太多”或类似错误。为什么会发生这种情况以及如何解决
下面是一些粗略的代码来演示这个问题。这不是完整的代码
import java.util.HashMap;
导入java.util.Map;
公开课演示{
公共静态void main(字符串[]args){
字符串twoHeartsStr=”
该代码不适用于某些特殊符号,如“两颗心”…为什么会发生这种情况
Javachar
类型是一个16位的值。在Unicode的早期,这足以存储所有的代码点值,但这一点很快发生了变化。已建立的Unicode规范允许超过一百万个字符,其中一些字符需要用数字符号表示
从:
字符串表示UTF-16格式的字符串,其中补充字符由代理项对表示(有关详细信息,请参阅字符类中的Unicode字符表示部分)。索引值指字符代码单位,因此补充字符在字符串中使用两个位置
继续:
twoHeartsStr.charAt(0)
这将给出代理项对的前半部分,它本身不是有效的字符,尽管它是有效的char
值(char
基本上是一个整数类型,而不是文本类型)
…以及如何修复它
您可以使用32位整数(即,int
或Integer
)来表示值,并从字符串中提取它们。但是,请注意,当您在字符串上迭代时,仍然需要跳过对应于对的后半部分的索引
您仍然无法将“补充字符”存储在字符
中,因此无法将其写入字符文字。因此,要在结果直方图中查找两个字符(或填充参考数据以进行测试),请,您需要从带有该符号的字符串中获取整数代码点值。根据Java的定义,“你真的把表情符号放进去了吗code@Ecto-是的。我希望得到带有这种表情符号的字符串。这会破坏字符计数器代码。我想防止它破坏。@完全允许这样做;Java程序是按照Java语言规范用Unicode编写的。请改用String
。字符类型为obSolite,无法表示Unicode中定义的140000多个字符中的一半。请改用Unicode整数。阅读谢谢。但是,charAt给出了一个字符。哪个字符串方法会给我一个字符串而不是字符,即类似于公共字符串ChartPlus(索引)的东西。您可以使用substring
方法返回两个(字符)索引之间的字符串;s.substring(0,s.offsetByCodePoints(0,1))
应返回一个包含s
的第一个Unicode符号的字符串。不,不正确,该表情符号是一个字符,而不是两个。问题是char
类型已过时,无法表示该单个字符。@BasilBourque您是否误读了我所说的“根据Java的定义”部分String.length
方法的表示返回“此对象表示的字符序列的长度”也要记住,正因为如此,字符串的length
方法不计算字符数,而是需要char
s来表示它们。这种笨重的、非现代的字符串处理是我放弃Java的众多原因之一。那么,对于字符串处理功能,您更喜欢哪种语言?