- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如您所知, InputStreamReader
将阅读提供的InputStream
并将其字节解码为字符。如果没有charset
指定后,它将使用默认字符集。
我们可以使用 java.nio.charset.Charset.defaultCharset().displayName()
检查这个默认字符集 .
情况 1。我的 Windows CMD 使用 cp850
,但 Java 报告 windows-1252
。可以证明输入字符ó
和System.in.read()
将报告162
,正如预期的那样。 InputStreamReader
但是,将无法解码它,因为它预计运行 windows-1252
,显示¢
(这是第 162 个 windows-1252
字符)。
情况 2。在 Windows 中,我的 Netbeans 集成终端使用 windows-1252
,但 Java 报告 UTF-8
。同样,可以证明输入字符 ó
和System.in.read()
将报告243
,正如预期的那样。 InputStreamReader
但是,将无法解码它,因为它预计运行 UTF-8
,显示�
(代码65533
)。
情况 3。我的 Debian 机器使用 UTF-8
无处不在,在 GNOME 和 Netbeans 终端中。当输入字符ó
时, System.in.read()
将报告两个字节,195
和161
,对应于UTF-8
该字符的表示。 InputStreamReader
将显示ó
正如预期的那样。
我想要什么?有没有办法正确检测使用的实际字符集,以便我可以从命令行读取字符(在 Windows CMD 和 Windows 中的 Netbeans 中)没有什么特殊情况吗?
非常感谢。
B 计划:案例 2 可以通过 changing Netbeans file encoding to UTF-8 解决(它也将处理 UTF-8 文件,这是 IDE 在 2019 年应该做的事情)。情况 1 可以通过将代码页更改为 UTF-8 来解决,但我无法做到这一点。
您可以使用以下程序来测试这些情况。输入相同的字符两次并比较输出。
import java.io.*;
import java.nio.charset.Charset;
public class Prova2 {
public static void main(String[] args) throws Exception {
int b;
System.out.println("Charset.defaultCharset: " + Charset.defaultCharset().displayName());
System.out.println("I will read the next bytes: ");
while ((b = System.in.read()) != '\n') {
System.out.println("I have read this byte: " + b + " (" + (char) b + ")");
}
System.out.println("I will read the next chars: ");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while ((b = br.read()) != '\n') {
System.out.println("I have read this char: " + b + " (" + (char) b + ")");
}
System.out.println("Thank you.");
}
}
最佳答案
Is there a way to correctly detect the actual charset used so I can read characters from the command line without any special case?
在 Windows 上您可以 detect (or even set) the code page used从命令行读取字符时 using JNA 。但是,如果使用替代方法来获取控制台输入,则没有必要:
System.in
读取数据,而是使用 System.console
捕获用户输入。这允许将提交的文本作为String
而不是byte
或char
进行处理。它提供对所有 String
方法的访问,以将控制台输入解释为字节、字符或 UTF-8 数据。chcp 1251
将代码页设置为 1251。使用这种方法只需两行代码即可获取用户输入:
Console console = System.console();
String userInput = console.readLine();
Case 2. In Windows, my Netbeans integrated terminal uses windows-1252...
不要浪费时间尝试让控制台输入在 NetBeans 中正常工作。 System.console()
将返回 null,并且无法配置其控制台。我怀疑其他 IDE 中也存在类似的限制。无论如何,NetBeans 内的测试不会带来任何有意义的好处。只需专注于从命令行进行测试。
Case 2 can be solved by changing Netbeans file encoding to UTF-8...
使用下面的方法,项目的编码设置并不重要。无论编码设置为 Windows-1252
还是 UTF-8
,它都会起作用。
注释:
chcp
是 Windows 特有的。)chcp 65001
用于 Unicode 输入。只需专注于确保可以使用合适的代码页成功读取输入即可。例如,当使用 OP 中提到的字符(ó
和 cent
)进行测试时,使用支持这两个字符的任何代码页都可以。例如:437、850、1252 等。如果应用程序正确显示提交的字符,那么一切都会好起来的(反之亦然)。这是代码,主要包括显示控制台输入:
package prova3;
import java.io.Console;
import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
import java.util.stream.Collectors;
public class Prova3 {
public static void main(String[] args) throws UnsupportedEncodingException {
Console console = System.console();
if (console == null) {
System.out.println("System.console() return null.");
System.out.println("If you are trying to run from within your IDE, use the command line instead.");
return;
}
System.out.println("Enter some characters...");
String userInput = console.readLine();
System.out.println("User input: " + userInput + " [String length: " + userInput.length() + ", chars: " + userInput.toCharArray().length + ", bytes: " + userInput.getBytes(StandardCharsets.UTF_8).length + "]");
System.out.println("codepoints: " + userInput.codePoints().boxed().map(n -> "x" + Integer.toHexString(n) + " (" + n + ")").collect(Collectors.toList()).toString());
System.out.println("UTF-8 bytes: " + getBytesList(userInput));
}
static String getBytesList(String userInput) throws UnsupportedEncodingException {
StringBuilder byteList = new StringBuilder("[");
for (int i = 0; i < userInput.length(); i++) {
byte[] bytes = userInput.substring(i, i + 1).getBytes(StandardCharsets.UTF_8);
for (int j = 0; j < bytes.length; j++) {
byteList.append(Character.forDigit((bytes[j] >> 4) & 0xF, 16))
.append(Character.forDigit((bytes[j] & 0xF), 16));
if (j < bytes.length - 1) {
byteList.append(" ");
}
}
if (i < userInput.length() - 1) {
byteList.append(", ");
}
}
byteList.append("]");
return byteList.toString();
}
}
关于Java 标准输入编码 Windows cmd、Netbeans,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54794272/
默认情况下,netbeans 将其设置存储在用户主目录下名为 .netbeans 的目录中。是否可以更改此目录的位置(尤其是在 Windows 下)? 感谢 James Schek,我现在知道了答案(
我每天都在使用 Netbeans IDE,突然我的“项目”和"file"选项卡消失了,我真的不知道该怎么办,我在谷歌上搜索过,但找不到任何合适且有效的解决方案来解决这个问题。 有人能帮助我吗? 如果您
我正在使用 Netbeans 来满足各种开发需求。但是安装大量插件会使 Netbeans 非常慢。是否可以为每个特定的开发需求(如 Eclipse)安装多个 Netbeans? 最佳答案 还有另一种方
只是一个简单的问题,我在哪里可以下载旧版本的 Netbeans? Netbeans 6.9.1 对 Java EE 开发人员来说尤为重要。 我看过他们的网站,但我只能找到 7.0.1 和 7.1 的下
我是新的 NetBeans 用户。当我加载我的项目时,一些文件被淡化了。当我将光标放在它们上时,它们显示为“忽略”。为什么?所有的 JAR 文件和类文件也会被忽略。 最佳答案 检查Tools->Opt
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 3年前关闭。 锁定。这个问题及其答案
任何人都知道是否可以在 netbeans 中搜索和替换所有打开的文件?如果有的话,似乎也找不到选项。 我正在使用 Netbeans 6.9 PHP IDE 最佳答案 CTRL+SHIFT+H 这将打开
是否可以将条目添加到由netbeans生成的jar的manifest.mf文件中? 例如构建一个osgi包。 最佳答案 请注意,您可以通过ant任务即时创建 list ,并动态设置属性。 首先,必须更
我最近开始使用 NetBeans,但缺少一个功能使我无法完全切换到 NetBeans。我一直使用终端,从 NetBeans 窗口切换到终端窗口很痛苦。 有没有办法将终端窗口嵌入到 NetBeans I
在netbeans中调试Java程序时,我希望调试器在导致NullPointerException的行上停止,以便可以在那里检查变量。我相信我必须在该行设置的断点上使用条件,但是条件的语法是什么? 谢
当我在JavaScript中使用PHP时,Netbeans 7.0将行突出显示为语法错误 就我而言 $(document).ready(function(){ $("#rating_comp
默认情况下,netbeans 中所有打开的文件都显示在水平选项卡中,就像浏览器一样。 我希望我的选项卡垂直列出,这可能吗? 最佳答案 工具 -> 选项 -> 外观 -> 选项卡位置 关于netbean
NetBeans 中是否有颜色选择器的快捷方式? 我在 NetBeans 网站上发现了同样的查询,据说这是可能的,但我找不到如何做到这一点的实际答案。 我的意思是:当我在 CSS 文件中编辑涉及颜色的
我刚刚开始使用 NetBeans,并正在尝试了解如何: 保存时删除尾随空格。我知道你可以手动调用它,但如果你忘记了,那就很烦人了。可以在保存时自动完成吗?我希望这样做是因为它可以保持代码整洁,因为当您
我正在开发一个 netbeans 应用程序,它的主要 TopComponent 包含一个渲染 Canvas : 当我关闭应用程序(不是顶级组件)时会生成一个错误,有时这会导致在应用程序关闭后运行一个进
有没有办法在 netbeans 中进行项目范围的搜索和替换?好像应该有,但是没找到相关信息。 谢谢 最佳答案 在编辑菜单下,您应该找到在项目中替换...的菜单项 关于netbeans - 搜索并替换整
如果是,怎么做? 最佳答案 在 Netbeans 6.9 for PHP 中,转到文件->项目属性。 在“类别”中,选择“运行配置”。有很多选项可以让您的整个项目在远程服务器上运行。 关于netbea
首先,我使用的是 NetBeans IDE 7.1(内部版本 201112071828)。 我有这段代码 onload = function() { tooltip.
/* * * This is a long comment. I broke it into lines, but that made it impossible to edit without
我在 netbeans 中有一个项目,其中有一个使用 jflex 生成的 java 扫描器。因此,当我通常使用 make 文件构建它时,我使用 -Xlint 选项,即 javac -Xlint jav
我是一名优秀的程序员,十分优秀!