当前位置: 首页 > 知识库问答 >
问题:

超过4个十六进制数字的Java unicode转义

艾仲渊
2023-03-14

Ant生成的Java属性文件

我预期\u0151,这是Ant中的一个bug吗?(Ant 1.8.0,Java 1.7.0)

(根据JLS,只有4位的unicode转义被认为是有效的...)

共有2个答案

公孙智
2023-03-14

虽然我没有发现与此问题相关的错误报告,但这可能是一个错误,基于官方的Oracle留档:Java平台中的补充字符

本文档指出,一个增补字符可以由两个 unicode 转义表示:

对于使用的字符编码不能直接表示字符的情况,Java编程语言提供了Unicode转义语法。该语法没有得到增强,无法直接表示补充字符。相反,它们由字符的UTF-16表示中两个代码单元的两个连续Unicode转义来表示。例如,字符U 20000写为“\uD840\uDC00”。

本文档还指定了用于表示文本输入的unicode转义语法的语法(即Java在语言级别不支持它):

对于文本输入,Java 2 SDK 提供了一个码位输入法,它接受格式为“\Uxxxxxx”的字符串,其中大写的“U”表示转义序列包含六个十六进制数字,因此允许补充字符。小写“u”表示转义序列的原始形式“\uxxxx”。

这意味着Ant

但实际上\Uxxxxxx语法似乎不受支持:

[测试属性]

key1=\u0151
key2=\u000151
key3=\U000151

[PropertiesParserTest.java]

import static org.junit.Assert.assertEquals;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Properties;
import org.junit.Test;

public class PropertiesParserTest {
    @Test
    public void testLoad() throws IOException {
        try (InputStream input = getClass().getResourceAsStream("test.properties")) {
            Properties p = new Properties();
            p.load(input);

            // Valid unicode escape
            assertEquals("ő", p.getProperty("key1"));

            // The 6-digit unicode escape generated by Ant is incorrect
            assertEquals("\u0001" + "51", p.getProperty("key2"));

            // \Uxxxxxx is not supported
            assertEquals("U000151", p.getProperty("key3"));
        }
    }

    @Test
    public void testGenerate() throws IOException {
        Properties p1 = new Properties();
        p1.setProperty("key1", "ő");
        p1.setProperty("key2", "\u000151");
        // Not supported in practice: p.setProperty("key3", "\U000151");

        File file = File.createTempFile("PropertiesParserTest_", ".properties");
        System.out.println(file);

        try (OutputStream output = new FileOutputStream(file)) {
            p1.store(output, null);
        }

        try (InputStream input = new FileInputStream(file)) {
            Properties p2 = new Properties();
            p2.load(input);

            // Valid unicode escape
            assertEquals("ő", p2.getProperty("key1"));

            // The 6-digit unicode escape generated by Ant is incorrect
            assertEquals("\u0001" + "51", p2.getProperty("key2"));
        }
    }
}

干高歌
2023-03-14

开始阅读Unicode序列的好地方是类Character的Javadoc:https://docs.oracle.com/javase/8/docs/api/java/lang/Character.html.我不能确定这是否是一个错误,但它看起来像一个错误。此外,您可能可以使用一个将任何文本转换为unicode序列的实用程序来解决这个问题,反之亦然。您可以在本文中找到具有此类实用程序的开源库的链接。在文章“字符串Unicode转换器”中查找段落

 类似资料:
  • 问题内容: 我在ex中有整数。16,我正在尝试将此数字转换为十六进制数字。我试图通过使用十六进制函数来实现此目的,但是每当您向十六进制函数提供整数时,它都会返回十六进制数字的字符串表示形式, 有人可以告诉我如何将字符串格式的十六进制数字转换为简单的十六进制数字。 谢谢!! 问题答案:

  • 问题内容: 我写了一些代码将十六进制显示字符串转换为十进制整数。但是,当输入类似100a或625b(带有字母的东西)时,我得到了这样的错误: java.lang.NumberFormatException:对于输入字符串:java.lang.Integer.parseInt(未知源)处的java.lang.NumberFormatException.forInputString(未知源)处为“ 1

  • 我正在写一个Rust程序,读取I2C总线并保存数据。当我读取I2C总线时,我会得到十六进制值,比如,,等等。 现在,我只能将其作为字符串处理并按原样保存。有没有办法把它解析成一个整数?它有内置的功能吗?

  • 我有十六进制字符串,例如“0x103E”,我想将其转换为整数。意思是to我尝试了但它给出了数字格式异常。我如何实现这一点?

  • Python3 实例 以下代码用于实现十进制转二进制、八进制、十六进制: # -*- coding: UTF-8 -*- # Filename : test.py # author by : www.runoob.com # 获取用户输入十进制数 dec = int(input("输入数字:")) print("十进制数为:", dec) print("转换为二进制为:", bin(dec

  • 我需要转换十六进制- 当我运行这个错误实际上是显示我需要的值但我不能得到它 groovy.lang.的方法:静态java.lang.我nteger.parseInt()适用于参数类型:(java.math.大整数,java.lang.整数)值:[28855032353026779507009821653742961358,...]可能的解决方案:parseInt(java.lang.String,