【问题标题】:Converting stream of int's to char's in java在java中将int的流转换为char
【发布时间】:2010-10-24 10:32:04
【问题描述】:

这可能已经在其他地方得到了回答,但是如何获得 int 值的字符值?

具体来说,我正在从 tcp 流中读取 a 并且 reader .read() 方法返回一个 int。

如何从中获取字符?

【问题讨论】:

  • 您没有详细说明您发送和读取的数据。您发送二进制字节还是 Unicode 字符? reader .read() 方法返回一个 int。是的,但它返回读取的字符,作为 0 到 65535 范围内的整数(或 -1,这是因为我认为使用 int 而不是 char)。也许只使用public int read(char[] cbuf) 就可以解决问题?
  • 这个问题的答案不适用于 JSP Java。如果您使用的是 jsp,请查看此堆栈溢出错误:stackoverflow.com/questions/4621836/…
  • 我认为这是一个有效的问题。将整数转换为 char 的困难之一是处理负值和 >= 255 的值。
  • 如果我想将字节数组中的字节转换为字符然后打印到控制台怎么办?

标签: java types


【解决方案1】:

也许你在问:

Character.toChars(65) // returns ['A']

更多信息:Character.toChars(int codePoint)

将指定的字符(Unicode 代码点)转换为存储在 char 数组中的 UTF-16 表示。如果指定的代码点是 BMP(基本多语言平面或平面 0)值,则生成的 char 数组具有与 codePoint 相同的值。如果指定的代码点是补充代码点,则生成的 char 数组具有相应的代理对。

【讨论】:

  • 仅当相关整数已经是 UTF-16 代码点时才有效。我们不知道是不是这样。
  • @Atec:不,我的意思是,如果他只是从流中读取字节(不清楚),那么通过强制转换或使用toChars 进行转换通常是不合适的。如果他正在阅读 Reader 的内容,那很好。
  • 虽然这个问题没有具体说明,但这个问题是谷歌搜索将 ASCII 码点转换为字符的第一个结果,所以我赞成它。
【解决方案2】:

这取决于“将 int 转换为 char”的含义。

如果您只是想将值转换为 int,您可以使用 Java 的类型转换表示法进行转换:

int i = 97; // 97 is 'a' in ASCII
char c = (char) i; // c is now 'a'

如果你的意思是将整数 1 转换为字符 '1',你可以这样做:

if (i >= 0 && i <= 9) {
char c = Character.forDigit(i, 10);
....
}

【讨论】:

  • 如果你要从 Char 到 Integer 怎么办? Integer.parseInt(c)?
  • 这个答案是唯一的:-)
【解决方案3】:

如果您尝试将流转换为文本,则需要知道要使用哪种编码。然后,您可以将一个字节数组传递给String 构造函数并提供Charset,或者将InputStreamReader 与适当的Charset 一起使用。

intchar 的简单转换仅适用于您需要 ISO-8859-1,如果您直接从流中读取字节。

编辑:如果您正在已经在使用Reader,那么将read() 的返回值转换为char 是正确的方法(在检查它是否为-1 之后) )... 但是调用read(char[], int, int) 一次阅读整块文本通常更高效、更方便。不过不要忘记检查返回值,看看已经读取了多少个字符。

【讨论】:

  • 我认为这不是 OP 所要求的。他正在使用Reader的read方法:java.sun.com/j2se/1.4.2/docs/api/java/io/Reader.html#read()他问的问题是如何将这个方法返回的值转换成char。
  • 如果他真的在使用 Reader,那肯定会有所作为。目前还不清楚,因为他在同一个句子中谈到了一个流和一个阅读器(小写 r):( 已经编辑了我的答案以明确这一点。
  • 您也可以将InputStreamReader 包装在BufferedReader 中,如javadoc docs.oracle.com/javase/8/docs/api/java/io/… 中所述
  • 为什么“仅当您需要 ISO-8859-1 时,从 int 转换为 char 才有效”?是不是因为 Java 内部使用 UTF-16,所有 ISO-8859-1 字符在 UTF-16 中保持相同的代码单元(位)?
  • @Sebastien:是的,基本上就是这样。
【解决方案4】:

如果您想简单地将 int 5 转换为 char '5': (仅适用于整数 0 - 9)

int i = 5;
char c = (char) ('0' + i); // c is now '5';

【讨论】:

  • No.. '0' + 5 变成字符串 '05'。右手边应该是 (char) ((int) '0') + i;
  • 不正确,因为字符不会在 Java 中转换为字符串。
  • +1 -- 久经考验,有效!自己尝试测试一下,貌似不像这里的评论者...
【解决方案5】:

简单的铸造:

int a = 99;
char c = (char) a;

这对你不起作用有什么原因吗?

【讨论】:

  • 危险建议,如果文本流不是纯 ASCII。请参阅上面 Jon Skeet 的回答。
  • 它可能不起作用。但我认为它实际上会。 char 数据类型存储 UTF-16 编码值。因此,要将 char 转换为 int,您需要进行一些转换。但是由于 OP 使用 read() 方法,该方法已经返回 UTF-16 编码值,所以我认为简单的转换会起作用。如果我错了,请纠正我。
  • 对不起,我的意思是“从 int 到 char”
  • 这将导致意外的编码值,而不是数字
【解决方案6】:

此解决方案适用于整数长度大小 =1。

Integer input = 9; Character.valueOf((char) input.toString().charAt(0))

如果 size >1 我们需要使用 for 循环并迭代。

【讨论】:

    【解决方案7】:

    这里的大多数答案都提出了捷径,如果您不知道自己在做什么,这可能会给您带来大问题。如果你想走捷径,那么你必须确切地知道你的数据是用什么编码的。

    UTF-16

    每当 java 在其文档中谈论字符时,它都会谈论 16 位字符。

    您可以使用DataInputStream,它有方便的方法。为提高效率,请将其包装在 BufferedReader 中。

    // e.g. for sockets
    DataInputStream in = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
    char character = readChar(); // no need to cast
    

    问题是每个readChar() 实际上会执行 2 个read 并将它们组合成一个 16 位字符。

    US-ASCII

    US-ASCII 保留 8 位来编码 1 个字符。 ASCII 表只描述了 128 个可能的字符,所以 1 位始终未使用。

    在这种情况下,您可以简单地执行强制转换。

    int input = stream.read();
    if (input < 0) throw new EOFException();
    char character = (char) input;
    

    扩展 ASCII

    UTF-8、Latin-1、ANSI 和许多其他编码都使用 8 位。前 7 位遵循 ASCII 表,与 US-ASCII 编码的相同。但是,第 8 位提供的字符在所有这些编码中都不同。所以,这里的事情变得有趣了。

    如果你是一个牛仔,并且你认为第 8 位无关紧要(即你不关心诸如“à、é、ç、è、ô ... 之类的字符),那么你可以得到一个简单的演员表。

    但是,如果您想专业地执行此操作,则在导入/导出文本(例如套接字、文件...)时,您应该始终指定一个字符集。

    始终使用字符集

    让我们认真一点。以上所有选项都是廉价的技巧。如果您想编写灵活的软件,您需要支持可配置的字符集来导入/导出数据。这是一个通用的解决方案:

    使用byte[] 缓冲区读取数据并将其转换为String 使用字符集参数

    byte[] buffer = new byte[1024];
    int nrOfBytes = stream.read(buffer);
    String result = new String(buffer, nrOfBytes, charset);
    

    您还可以使用InputStreamReader,它可以使用字符集参数进行实例化。

    还有一条黄金法则:永远不要直接将字节转换为字符。这总是一个错误。

    【讨论】:

      【解决方案8】:

      假设用户只是想将 int 转换为 char ,例如

      Input: 
      int i = 5; 
      Output:
      char c = '5'
      

      上面已经回答了这个问题,但是如果是整数值i &gt; 10,那么需要使用char array

      char[] c = String.valueOf(i).toCharArray();
      

      【讨论】:

        【解决方案9】:
            int i = 7;
            char number = Integer.toString(i).charAt(0);
            System.out.println(number);
        

        【讨论】:

          【解决方案10】:

          这完全取决于传入数据的编码。

          【讨论】:

          • 这是无用的“答案”,我会投反对票,但它甚至不值得。
          • @Lpc_dark 这个答案比 90% 的其他答案更正确。有关详细信息,请参阅我的答案。
          【解决方案11】:

          也许不是最快的:

          //for example there is an integer with the value of 5:
          int i = 5;
          
          //getting the char '5' out of it:
          char c = String.format("%s",i).charAt(0); 
          

          【讨论】:

            【解决方案12】:

            将 char 转换为 int 或 long 的答案是简单的转换。

            例如:- 如果您想将 Char '0' 转换为 long。

            跟随简单的演员表

            Char ch='0';
            String convertedChar= Character.toString(ch);  //Convert Char to String.
            Long finalLongValue=Long.parseLong(convertedChar);
            

            完成!!

            【讨论】:

            • 这与他的要求完全相反。
            猜你喜欢
            • 2013-08-01
            • 2014-05-02
            • 2013-10-14
            • 2013-12-11
            • 2019-04-05
            • 2019-03-15
            • 1970-01-01
            • 2013-05-13
            相关资源
            最近更新 更多