这是一个"元问题",当我试图为我的另一个问题找到更好的规范时,我遇到了这个问题(在Mac OS X上的Java Swing JComponent中渲染Devanagari连字符(Unicode)).
到目前为止我还不太了解的是给定系统的哪个"组件"(想要更好的词)负责在Java中显示Unicode文本,更具体地说是连字.
据我了解,以下组件对流程有影响:
Charset(默认情况下是Mac OS X 10.6上的MacRoman,Windows 7上的cp1252)."字体包含有关他们正在使用的编码的信息".
因此,如果一串Unicode字符无法正确显示(如我的另一个问题所示,sa),问题最可能出在哪里?即,什么"组件"(更好的词会是什么?)负责"绑定"结扎,它的组成?
非常感谢您提前,如果您需要更多信息,请告诉我.
目前我正在尝试以mime格式读取文件,其中包含一些png的二进制字符串数据.
在Windows中,读取文件为我提供了正确的二进制字符串,这意味着我只需复制字符串并将扩展名更改为png即可看到图片.
在Windows中读取文件后的示例如下:
--fh-mms-multipart-next-part-1308191573195-0-53229
Content-Type: image/png;name=app_icon.png
Content-ID: "<app_icon>"
content-location: app_icon.png
‰PNG
Run Code Online (Sandbox Code Playgroud)
等...等...
在Linux中读取文件后的示例如下:
--fh-mms-multipart-next-part-1308191573195-0-53229
Content-Type: image/png;name=app_icon.png
Content-ID: "<app_icon>"
content-location: app_icon.png
�PNG
Run Code Online (Sandbox Code Playgroud)
等...等...
我无法将Linux版本转换成图片,因为它变成了一些时髦的符号,并且有很多颠倒的"?" 和"1/2"符号.
任何人都可以告诉我发生了什么,也许可以提供解决方案?已经玩了一周以上的代码了.
text/plain; charset=utf-8我将 UTF-8 文本存储在数据库中并在 Web 应用程序中使用。一切都运转良好。我可以在浏览器窗口上看到 UTF-8 文本,没有任何问题。
但是,当我将该文本保存到文件并尝试在 Windows 记事本中打开它时,我发现一些字符丢失并显示为一个小矩形框。但是,该文本文件在其他编辑器(例如 EditPlus 和 Notepad++)中看起来不错。
这是如何引起的以及如何解决?
使用String.getBytes()是否安全?当程序在具有不同默认值的不同系统上运行时会发生什么charset?我想我可以获得不同的内容byte[]?是否可以定义首选字符集Java 1.4?
每次创建新工作区时,Eclipse 都会默认使用 Cp1250 编码。
每当我创建项目的新分支并切换到 Eclipse 中的新工作区时,我需要转到Window -> Preferences -> General -> Workspace : Text file编码并手动切换到“Other: UTF-8” ”。如果我忘记了这一步,Eclipse 会破坏项目文件中的 UTF-8 字符。
我可以以某种方式永久更改默认设置,以便所有新工作区都以 UTF-8 启动,而无需手动切换它们吗?
使用ByteBuffer,我可以将字符串转换为字节数组:
val x = ByteBuffer.allocate(10).put("Hello".getBytes()).array()
> Array[Byte] = Array(104, 101, 108, 108, 111, 0, 0, 0, 0, 0)
Run Code Online (Sandbox Code Playgroud)
将字节数组转换为字符串时,我可以使用new String(x).但是,字符串变为hello?????,我需要在将字节数组转换为字符串之前对其进行修剪.我怎样才能做到这一点?
我使用这段代码来减少零,但我想知道是否有更简单的方法.
def byteArrayToString(x: Array[Byte]) = {
val loc = x.indexOf(0)
if (-1 == loc)
new String(x)
else if (0 == loc)
""
else
new String(x.slice(0,loc))
}
Run Code Online (Sandbox Code Playgroud) 问题:
在使用斯洛文尼亚语键盘布局的英文 Windows 10 上,所有命令行界面似乎都无法显示(打印)UTF-8 字符,即 ?、š 和 ž,它们被替换为 ?。(我假设所有 UTF-8 特定字符,因为 ? 和 ? 也不起作用。)
测试于:
到目前为止尝试过:
示例代码:
public class Test2 {
public static void …Run Code Online (Sandbox Code Playgroud) 我正在使用以下代码读取资源:
val source = Source.fromResource(pathWithoutSlash)
val lines:Seq[String] = (for (l <- source.getLines() if ! l.trim.isEmpty) yield l.trim).toList
Run Code Online (Sandbox Code Playgroud)
当我在本地运行该代码时,它工作正常-但在服务器上,它失败并显示:
Exception in thread "main" java.nio.charset.MalformedInputException: Input length = 1
at java.base/java.nio.charset.CoderResult.throwException(CoderResult.java:274)
at java.base/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339)
at java.base/sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
at java.base/java.io.InputStreamReader.read(InputStreamReader.java:185)
at java.base/java.io.BufferedReader.fill(BufferedReader.java:161)
at java.base/java.io.BufferedReader.readLine(BufferedReader.java:326)
at java.base/java.io.BufferedReader.readLine(BufferedReader.java:392)
at scala.io.BufferedSource$BufferedLineIterator.hasNext(BufferedSource.scala:70)
Run Code Online (Sandbox Code Playgroud)
我猜是因为文件确实包含一些重音字符,例如:éclair's,并且服务器上使用的默认字符集可能与我本地的字符集不同。
我的问题是,如何更改服务器上的字符集,使其与我本地拥有的字符集匹配(以及如何检查本地拥有的字符集)?
谢谢。
我正在编写一个用于地理坐标工作的Java库,测试是使用Scala中的specs2实现的.我有很多测试,它们对包含度数符号°(非ASCII字符)的字符串进行字符串比较.
如果我从IntelliJ中运行这些测试,它们都会通过.他们也传递了特拉维斯CI.但是,如果我sbt test从我的Power Shell(Windows x64)运行(sbt 11.3),所有这些测试都会失败,并且控制台会显示错误的字符串,如屏幕截图所示:

可能是什么问题,我该如何解决?我检查了文件是UTF8编码的.另请注意,更改我的Java配置无济于事,因为如果其他人克隆了存储库,则必须运行测试(因此任何仅在我的系统上解决问题的解决方案都无济于事).但我完全不知道这里出了什么问题......
在Java中,我一直在尝试使用UTF-8编码将String写入文件,稍后将由另一个用不同编程语言编写的程序读取.在这样做时,我注意到将String编码为字节数组时创建的字节似乎没有正确的字节值.
我将问题缩小到符号"£",这似乎在编码为UTF-8时产生不正确的字节
byte[] byteArray = "£".getBytes(Charset.forName("UTF-8"));
// Print out the Byte Array of the UTF-8 converted string
// Upcast byte values to print the bytes as unsigned
for (byte signedByte : byteArray) {
System.out.print((signedByte & 0xFF) + " ");
}
Run Code Online (Sandbox Code Playgroud)
这输出6个字节的十进制值:239 190 130 239 189 163,以十六进制表示:ef be 82 ef bd a3
http://www.utf8-chartable.de/但是说十六进制中"£"的值是:c2 a3,输出应该是:194 163
当编码为UTF-8时,其他字符串似乎产生正确的字节,所以我想知道为什么Java为"£"生成这6个字节,以及我应该如何通过使用UTF-8编码将字符串正确地转换为字节数组
我也试过了
OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(outputFile), "UTF-8");
out.write("£");
out.close();
Run Code Online (Sandbox Code Playgroud)
但这产生了相同的6个字节