【问题标题】:Recieving 65533 as char value for characters as (à, Ø, æ, æ etc)!接收 65533 作为字符的字符值(à、Ø、æ、æ 等)!
【发布时间】:2017-05-18 16:07:38
【问题描述】:

我已经尝试了几个小时来弄清楚为什么当通过扫描仪在控制台中输入像 Ø 这样的字符时,然后获取数值,我总是以 65533(无符号短的最大值)结束?

这似乎不是拉丁字符的情况。知道为什么吗?

public static void main(String[] args) {

    Scanner sc = new Scanner(System.in);
    char[] chars = sc.next().toCharArray();

    for(int i = 0; i < chars.length; i++){

        System.out.println((int)chars[i]);
    }
}

【问题讨论】:

  • 也许你应该发布一些代码
  • 这实际上是一个非常简单直接的代码!我添加了代码。

标签: java char short


【解决方案1】:

65533 = Unicode Character 'REPLACEMENT CHARACTER' (U+FFFD)

即您的字符在您使用的字符编码中没有被正确解释,因此被备用值替换。

【讨论】:

  • 我该如何解决它?
  • 首先关注@Vampire 的评论并发布您的代码,以便我们复制您的问题。
【解决方案2】:

您遇到了编码问题。
通过System.in 传入的字节不在Scanner 用于将这些字节转换为字符的编码中。
我猜你的System.inCp1252(Windows 默认编码),但你的扫描仪用户UTF-8 来解码字节。
则字节序列不是有效的 UTF-8 字符,因此使用替换字符。

如果您使用Scanner sc = new Scanner(System.in, System.getProperty("file.encoding"));,您的代码应该可以在任何地方正常工作。

【讨论】:

  • 很遗憾没有!我正在考虑将字符串编码为 base64 并从那里继续我的操作。
  • 我不知道这应该有什么帮助,但如果它解决了您的问题,请继续。但是,如果您想将该 base64 字符串转换回某些字符,您仍然必须知道 System.in 的字节编码应该是 file.encoding 的内容。
  • 这个工作但是,Scanner sc = new Scanner(System.in, "Cp1252");
  • 那么你可能会在System.in 已经创建之后将file.encoding 设置为其他值。请注意,如果您对编码进行硬编码,您的代码将无法在 Linux、Mac 或 Windows 以外的任何其他设备上正常工作。
猜你喜欢
  • 1970-01-01
  • 2011-10-29
  • 1970-01-01
  • 2012-05-31
  • 2023-03-11
  • 2013-12-07
  • 1970-01-01
  • 2018-01-28
  • 1970-01-01
相关资源
最近更新 更多