Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java代码中的表情符号-字符文字中的字符太多_Java_Character_Special Characters - Fatal编程技术网

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=”
该代码不适用于某些特殊符号,如“两颗心”…为什么会发生这种情况

Java
char
类型是一个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的众多原因之一。那么,对于字符串处理功能,您更喜欢哪种语言?