将俄语输入从网络导入java应用程序



我显然在这里遗漏了一些东西。我有一个网络应用程序,表单的输入可能是英语,或者在键盘切换后是俄语。页面的元标记指定页面为UTF-8。这似乎无关紧要。

如果我键入";вв";,两个unicode字符:CYRILLIC小写字母VE

我能得到什么?一根绳子。我调用getCodePoints((.toArray((,得到:

[208, 178, 208, 178]

如果我调用chars((.toArray[],我会得到相同的结果。

怎么了?

我完全可以控制网页,但当然会有不同的浏览器。但是,我如何才能从网页上得到一些东西,让我得到合适的西里尔字母呢?

这是在java 1.8.0_312上。我可以升级一些,但不能一直升级到最新的java。

页面是这样的:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<html>
<head>
<title>Cards</title>
<link rel = "stylesheet" href = "https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity = "sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin = "anonymous" />
<link rel = "stylesheet" href = "https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" integrity = "sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin = "anonymous" />
<script src = "https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity = "sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin = "anonymous">
</script>
<meta http-equiv = "Content-Type" content = "text/html; charset=UTF-8" />
<style>.table-nonfluid { width: auto !important; }</style>
</head>
<body>
<div style = "padding: 25px 25px 25px 25px;">
<h2 align = "center">Cards</h2>
<div style = "white-space: nowrap;">
<a href="/cgi-bin/WebObjects/app.woa/wo/ee67KCNaHEiW1WdpdA8JIM/2.1">Home</a>
<div>
<form name="f_3_1" method="post" action="/cgi-bin/WebObjects/app.woa/wo/ee67KCNaHEiW1WdpdA8JIM/2.3.1">
<table class = "table" border = "1" style = "max-width: 50%; font-size: 300%; text-align: center;">
<tr>
<td>to go</td>
</tr>
<tr>
<td><input size="25" type="text" name="3.1.5.3.3" /></td>
</tr>
<td>
<input type="submit" value="Submit" name="3.1.5.3.5" />&nbsp;&nbsp;<a href="/cgi-bin/WebObjects/app.woa/wo/ee67KCNaHEiW1WdpdA8JIM/2.3.1.5.3.7">Skip</a>
</td>
</table>
<input type="hidden" name="wosid" value="ee67KCNaHEiW1WdpdA8JIM" />
</form>
</div>
</div>
</div>
</body>
</html>

嗯。好吧,这至少是故事的一部分。

我有这个代码:

System.out.println("start: " + start);
int[] points = start.chars().toArray();
byte[] next = new byte[points.length];
int idx = 0;
System.out.print("fixed: ");
for (int p : points) {
next[idx] = (byte)(p & 0xff);
System.out.print(Integer.toHexString(next[idx]) + " ");
idx++;
}
System.out.println("");

输出为:

start: вв
fixed: ffffffd0 ffffffb2 ffffffd0 ffffffb2 

并且UTF-8值为"0";В";,在十六进制中,是d0b2。

问题是,为什么这不更容易获得?我真的必须一个字节一个字节地把它放在一起吗?

如果字符串已经是UTF-8格式的,我想我们可以看到,为什么codePoints((方法没有给我们,你知道,codePoints?

好的,现在我做了:

new String(next, StandardCharsets.UTF_8);

我得到了合适的绳子。但codePoints((给我一个IntStream似乎仍然很奇怪,但如果你把这些东西用作int值,它就坏了。

这是我使用的框架的问题。我以为我正在将请求和响应内容类型设置为utf-8,但事实并非如此。

最新更新