Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.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 HashMap的行为不符合中文字符的预期_Java_Utf 8_Chinese Locale - Fatal编程技术网

Java HashMap的行为不符合中文字符的预期

Java HashMap的行为不符合中文字符的预期,java,utf-8,chinese-locale,Java,Utf 8,Chinese Locale,在Java中,我从一个文件中读取上面的文本,并创建一个映射,其中键是逗号前面的部分,值是逗号后面的区域代码 代码如下: China-中国,CN Angola-安哥拉,AO Afghanistan-阿富汗,AF Albania-阿尔巴尼亚,AL Algeria-阿尔及利亚,DZ Andorra-安道尔共和国,AD Anguilla-安圭拉岛,AI 地图加载正确,但当我在地图上搜索“中国”时-中国" - 我没有得到这个值 如果我明确地说“中国”-中国在map中,则返回一个值。 为什么会发生这种情况

在Java中,我从一个文件中读取上面的文本,并创建一个映射,其中键是逗号前面的部分,值是逗号后面的区域代码

代码如下:

China-中国,CN
Angola-安哥拉,AO
Afghanistan-阿富汗,AF
Albania-阿尔巴尼亚,AL
Algeria-阿尔及利亚,DZ
Andorra-安道尔共和国,AD
Anguilla-安圭拉岛,AI
地图加载正确,但当我在地图上搜索“中国”时-中国" - 我没有得到这个值

如果我明确地说“中国”-中国在map中,则返回一个值。
为什么会发生这种情况?

由于第一个值有问题,我会检查文件是否以(字节顺序标记)开头

如果是,请在处理之前尝试剥离BOM表


请参阅:

由于第一个值有问题,我将检查文件是否以(字节顺序标记)开头

如果是,请在处理之前尝试剥离BOM表


请参阅:

检查您的资源文件是否不是UTF-8,例如UTF-8Y,起始处有BOM字节。但这只能根据第一个值进行推断。如果将测试更改为中间的值,是否有值?如果没有,则这不是问题

第二种可能是您的源代码文件不是UTF-8。因此,字节序列为“China”-中国“您的资源文件和源代码文件的值不相等,您将无法获得匹配项。但您将该值显式包含在源代码字节序列中,然后将找到该值。”


事实上,这不是HashMap的问题,而是字符或文件编码的问题。

检查您的资源文件是否为UTF-8,例如UTF-8Y,开头有BOM字节。但这只能推断第一个值。如果将测试从中间更改为值,是否有值?如果没有,则这不是问题

第二种可能是您的源代码文件不是UTF-8。因此,字节序列为“China”-中国“您的资源文件和源代码文件的值不相等,您将无法获得匹配项。但您将该值显式包含在源代码字节序列中,然后将找到该值。”


事实上,这不是HashMap的问题,而是字符或文件编码的问题。

您可以使用org.apache.commons.io.input.BOMInputStream

:
:
Egypt-埃及
Guyana-圭亚那
New Zealand-新西兰
China-中国
Indonesia-印度尼西亚
Laos-老挝
Chad-乍得
Korea-韩国
:
:
Returned from map  null
Explicitly Put
done

您可以使用org.apache.commons.io.input.BOMInputStream

:
:
Egypt-埃及
Guyana-圭亚那
New Zealand-新西兰
China-中国
Indonesia-印度尼西亚
Laos-老挝
Chad-乍得
Korea-韩国
:
:
Returned from map  null
Explicitly Put
done


请澄清。您获得的输出不可能来自您发布的代码。System.out.println(“从地图返回”+mymap.get(“中国”)-中国“”);为什么打印空值?文件是否以BOM开头?请使用UTF-8保存CSV文件,然后重试。您获得的输出不可能来自您发布的代码。System.out.println(“从地图返回”+mymap.get(“中国”)-中国"));为什么打印空值?文件是否以BOM开头?使用UTF-8保存CSV文件,然后tryYeah,长度不同。检查长度是否相同?如果不相同,将文件编码更改为UTF-8无BOM编码格式。这是可行的。是的,长度不同。检查长度是否相同?如果不相同,将文件编码更改为UTF-8无BOM编码格式。这是可行的工作。砰的一声!!是的,我搜索了除第一个键以外的其他键,它工作了。然后我添加了一些虚拟词作为第一行。它在第二行之后工作得很好。如何识别它的开头是否有不需要的字符。@KaushikLele 1。wumpz提到的第一个可能性是我答案的副本,我还提供了一个指向推荐解决方案的链接ns.(如果第一个发布答案的人获得学分,那就太好了…)2.wumpz提到的第二种可能性是不可能的,基于给定的输出。Oops。我不打算重复。对不起。@PatrickParker您的答案是有用的和信息丰富的。但是上面的答案是在您的答案之前以默认排序的方式看到的。另外,上面以外行术语给出的答案帮助我更快地找到解决方法对于我的问题,这是最好的答案。我对你做了+1,你肯定会得到后续观众更多的赞誉。正如你所理解的,一个更好的/简单的解释会提高答案的可接受性。砰的一声!!是的,我搜索了除第一个以外的其他关键字,成功了。然后我添加了一些虚拟词作为第一行。成功了好的,从第二行开始。如何识别它的开头是否有不需要的字符。@KaushikLele 1。wumpz提到的第一种可能性是我的答案的副本,我还提供了一个到推荐解决方案的链接。(如果第一个发布答案的人获得学分会更好…)2.wumpz提到的第二种可能性是不可能的,基于给定的输出。Oops。我不打算重复。对不起。@PatrickParker您的答案是有用的和信息丰富的。但是上面的答案是在您的答案之前以默认排序的方式看到的。另外,上面以外行术语给出的答案帮助我更快地找到解决方法对于我的问题,这是最好的答案。我给了你+1,你肯定会得到后续观众更多的赞誉。正如你所理解的,一个更好/简单的解释可以提高答案的可接受性。行首值是BOM。你也可以使用replace。line.replace(“\uFEFF”,”)。但仅适用于UTF-8编码。行的第一个值是BOM。您也可以使用replace来执行此操作。行。replace(“\uFEFF”,”)。但仅适用于UTF-8编码。
BufferedReader br= new BufferedReader(new InputStreamReader(new BOMInputStream(new FileInputStream("filepath")),"UTF-8"))