Tag: utf 16

Java将int隐式转换为byte

我即将开始处理需要读取字节和创建字符串的事情。 正在读取的字节代表UTF-16字符串。 所以只是为了测试我想要将UTF-16编码的简单字节数组转换为字符串。 数组中的前2个字节必须表示字节序,因此必须是0xff 0xfe或0xfe 0xff。 所以我尝试按如下方式创建我的字节数组: byte[] bytes = new byte[] {0xff, 0xfe, 0x52, 0x00, 0x6F, 0x00}; 但是我收到一个错误,因为0xFF和0xFE太大而无法放入一个字节(因为字节是用Java签名的)。 更准确地说,错误是int无法转换为字节。 我知道我可以使用强制转换显式地从int转换为byte并获得所需的结果,但这不是我的问题。 为了尝试一些东西,我创建了一个String并调用了getBytes(“UTF-16”)然后打印了数组中的每个字节。 输出有点令人困惑,因为前两个字节是0xFFFFFFFE 0xFFFFFFFF,后跟0x00 0x52 0x00 0x6F。 (显然这里的字节顺序与我上面尝试创建的不同,但这并不重要)。 使用此输出我决定尝试以相同的方式创建我的字节数组: byte[] bytes = new byte[] {0xffffffff, 0xfffffffe, 0x52, 0x00, 0x6F, 0x00}; 奇怪的是,它工作得很好。 所以我的问题是,为什么Java允许0xFFFFFF80或更大的整数值自动转换为没有显式强制转换的字节,但任何等于或大于0x80的东西都需要显式强制转换?

如何在java中将UTF-16转换为UTF-32?

我一直在寻找解决方案,但这个主题似乎并不多。 我找到了建议的解决方案: String unicodeString = new String(“utf8 here”); byte[] bytes = String.getBytes(“UTF8″); String converted = new String(bytes,”UTF16”); 但是,从utf8转换为utf16,java不处理“UTF32”,这使得该解决方案不可行。 有没有人知道如何实现这一目标?

UTF-8和UTF-16之间是否存在巨大差异?

我调用了一个webservice,它给了我一个具有UTF-8编码的响应xml。 我在java中使用getAllHeaders()方法检查了它。 现在,在我的java代码中,我接受了该响应,然后对其进行了一些处理。 然后,将其传递给不同的服务。 现在,我google了一下,发现默认情况下,Java中的字符串编码是UTF-16。 在我的回复xml中,其中一个元素有一个字符É。 现在这搞砸了我对不同服务的后处理请求。 它没有发送É,而是发送了一些乱七八糟的东西。 现在我想知道,这两种编码真的会有很大不同吗? 如果我想知道什么将从UTF-8转换为UTF-16,那么我该怎么做呢? 谢谢

有没有理由比UTF-8更喜欢UTF-16?

检查UTF-16和UTF-8的属性,我找不到任何理由更喜欢UTF-16。 但是,检查Java和C#,它看起来像字符串和字符默认为UTF-16。 我认为这可能是出于历史原因,或者出于性能原因,但无法找到任何信息。 有谁知道为什么这些语言选择UTF-16? 还有什么理由让我这样做吗? 编辑:同时我也找到了这个答案 ,这似乎是相关的,并有一些有趣的链接。

为什么Java char使用UTF-16?

最近我读了很多关于unicode代码点以及它们如何随着时间的推移而演变的事情,并确定我也阅读了http://www.joelonsoftware.com/articles/Unicode.html 。 但是我无法找到Java使用UTF-16作为char的真正原因。 例如,如果我的字符串包含1024个字母的ASCII范围字符串字符串。 它意味着1024 * 2 bytes ,相当于它将消耗的2KB字符串内存。 因此,如果Java base char是UTF-8,那么它只有1KB的数据。 即使字符串有任何需要2字节的字符,例如10字符“字”,它自然会增加内存消耗的大小。 (1014 * 1 byte) + (10 * 2 bytes) = 1KB + 20 bytes 结果不是那个明显的1KB + 20 bytes VS. 2KB 1KB + 20 bytes VS. 2KB我不是说关于ASCII但我对此的好奇心为什么它不是UTF-8,它只是照顾多字节字符。 UTF-16在任何具有大量非多字节字符的字符串中看起来像浪费内存。 这背后有什么好理由吗?

如何在Java中编写3字节的unicode文字?

我想用Java编写unicode文字U + 10428。 http://www.marathon-studios.com/unicode/U10428/Deseret_Small_Letter_Long_I 我试过’\ u10428’并且它没有编译。

Java中的UTF-16编码与C#

我试图读取UTF-16编码方案中的字符串并对其执行MD5哈希。 但奇怪的是,当我尝试这样做时,Java和C#会返回不同的结果。 以下是Java中的一段代码: public static void main(String[] args) { String str = “preparar mantecado con coca cola”; try { MessageDigest digest = MessageDigest.getInstance(“MD5”); digest.update(str.getBytes(“UTF-16”)); byte[] hash = digest.digest(); String output = “”; for(byte b: hash){ output += Integer.toString( ( b & 0xff ) + 0x100, 16).substring( 1 ); } System.out.println(output); } catch (Exception e) { […]

如何使用BOM对UTF-16LE字节数组进行编码/解码?

我需要在java.lang.String编码/解码UTF-16字节数组。 字节数组通过字节顺序标记(BOM)提供给我,我需要使用BOM编码字节数组。 此外,因为我正在处理Microsoft客户端/服务器,我想以小端(以及LE BOM)发出编码以避免任何误解。 我确实意识到使用BOM它应该工作大端,但我不想在Windows世界游泳上游。 作为一个例子,这里有一个方法,它使用BOM将java.lang.String编码为带小端的UTF-16 : public static byte[] encodeString(String message) { byte[] tmp = null; try { tmp = message.getBytes(“UTF-16LE”); } catch(UnsupportedEncodingException e) { // should not possible AssertionError ae = new AssertionError(“Could not encode UTF-16LE”); ae.initCause(e); throw ae; } // use brute force method to add BOM byte[] utf16lemessage = new byte[2 […]

Java中的UTF-16到ASCII转换

一直忽略它,我目前正在强迫自己学习更多关于Java中的unicode。 关于将UTF-16字符串转换为8位ASCII,我需要做一些练习。 有人可以请教我如何用Java做到这一点? 我知道你不能用ASCII代表所有可能的unicode值,所以在这种情况下我想要一个超过0xFF的代码只是被添加(坏的数据也应该只是静默添加)。 谢谢!

Java charAt用于具有两个代码单元的字符

来自Core Java ,第一卷。 1,第9版,p。 69: 字符ℤ需要两个UTF-16编码的代码单元。 调用 String sentence = “ℤ is the set of integers”; // for clarity; not in book char ch = sentence.charAt(1) 不返回空格而是返回second的第二个代码单元。 但似乎sentence.charAt(1) 确实返回了一个空格。 例如,以下代码中的if语句的计算结果为true 。 String sentence = “ℤ is the set of integers”; if (sentence.charAt(1) == ‘ ‘) System.out.println(“sentence.charAt(1) returns a space”); 为什么? 我在Ubuntu 12.10上使用JDK SE 1.7.0_09,如果它是相关的。