gpt4 book ai didi

java - 从 URL 获取内容返回奇怪的字符

转载 作者:行者123 更新时间:2023-11-29 03:07:31 26 4
gpt4 key购买 nike

我正在使用此方法从 url 获取内容:

public String getContentFromURL(String stringUrl) throws UnsupportedEncodingException{
String content = "";
try {
URL url = new URL(stringUrl);
URLConnection urlc = url.openConnection();
StringBuilder builder;
try (BufferedReader buffer = new BufferedReader(new InputStreamReader(urlc.getInputStream(), "UTF-8"))) {
builder = new StringBuilder();
int byteRead;
while ((byteRead = buffer.read()) != -1)
builder.append((char) byteRead);
}
content=builder.toString();
return content;
} catch (MalformedURLException ex) {
Logger.getLogger(Utils.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(Utils.class.getName()).log(Level.SEVERE, null, ex);
}
return content;
}

它对我得到的大多数文件都有效,除了那些来自其他语言的字符,例如:áí等等... 而不是我得到的那些字符 .

  1. 我试过这样设置 tomcat 连接器:

           <Connector port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8"
    connectionTimeout="20000"
    redirectPort="8443" />
  2. 页面编码为:<%@page contentType="text/html" pageEncoding="UTF-8"%>

  3. 在 servlet 中也添加了这个:

    response.setContentType("text/html;charset=UTF-8");
    response.setCharacterEncoding("UTF-8");
    request.setCharacterEncoding("UTF-8");
  4. 尝试将内容解码为 GZIP。

以上选项都不适合我。

这是我试图从中获取内容的 url:

https://www.dropbox.com/s/kpbrx26bwhoa1rp/moment.js?raw=1

它是 dropbox 中的一个文件,即使浏览器也可以使用 raw=1 正确读取直接获取文件的内容。在浏览器中,尝试搜索 "[Môre om]检查它是否正确显示。

从包含奇怪字符的 URL 获取内容的正确方法是什么?

PD:使用 notepad++ 我确定它的编码是 utf-8 dropbox

PD2:从连接获取字符编码返回 null。

更新:使用 Google Guava 尝试此代码图书馆:

        String content = "";
URLConnection url = new URL("https://www.dropbox.com/s/kpbrx26bwhoa1rp/moment.js?raw=1").openConnection();

InputStream stream = url.getInputStream();
content = CharStreams.toString(new InputStreamReader(stream, Charsets.UTF_8));
Closeables.closeQuietly(stream);

try (PrintStream outText = new PrintStream(new FileOutputStream("C:\\Users\\myUser\\Desktop\\test.txt"))) {
outText.print(content);
outText.close();
}

它确实适用于普通 java 项目并且所有字符都正确显示但不是 Java Web App 项目,这是我尝试此方法的索引:

<%@page import="java.io.PrintStream"%>
<%@page import="java.io.FileOutputStream"%>
<%@page import="com.google.common.io.Closeables"%>
<%@page import="java.io.InputStreamReader"%>
<%@page import="com.google.common.io.CharStreams"%>
<%@page import="com.google.common.base.Charsets"%>
<%@page import="java.io.InputStream"%>
<%@page import="java.net.URLConnection"%>
<%@page import="java.net.URL"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<%
response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
request.setCharacterEncoding("UTF-8");

String content = "";
URLConnection url = new URL("https://www.dropbox.com/s/kpbrx26bwhoa1rp/moment.js?raw=1").openConnection();

InputStream stream = url.getInputStream();
content = CharStreams.toString(new InputStreamReader(stream, Charsets.UTF_8));
Closeables.closeQuietly(stream);

try (PrintStream outText = new PrintStream(new FileOutputStream("C:\\Users\\myUser\\Desktop\\test.txt"))) {
outText.print(content);
outText.close();
}
%>
</body>
</html>

当我查看创建的文件时,这些 仍然出现。 为什么相同的代码在独立应用和网络应用之间表现不同?

已解决:替换

try (PrintStream outText = new PrintStream(new FileOutputStream("C:\\Users\\myUser\\Desktop\\test.txt"))) {
outText.print(content);
outText.close();
}

Writer outText = new BufferedWriter(new OutputStreamWriter( new FileOutputStream("C:\\Users\\myUser\\Desktop\\testRaw.txt"), "UTF-8"));
try {
outText.write(content);
} finally {
outText.close();
}

最佳答案

您以默认编码编写文本,最好将其存储为 UTF-8。

try (PrintStream outText = new PrintStream(
new File("C:\\Users\\myUser\\Desktop\\test.txt"), "UTF-8")) {
if (!content.startsWith("\uFEFF")) {
outText.print("\uFEFF");
}
outText.print(content);
} // Calls outText.close()

这也会在开头写入带有 BOM 字符 '\uFEFF' 的文本。这是一个不可见的零宽度空间,Windows 可以使用它来检测 UTF-8。这实际上是一种不好的做法,但允许在记事本中编辑文本。

错误是某些 Unicode 字符无法映射到默认编码。

旁白:您假设 URL 中的文本是 UTF-8 格式的。一般来说,最好通过 URLConnection header 进行检查。

String encoding = urlc.getContentEncoding();
if (encoding == null) {
encoding = "UTF-8";
} else if (encoding.equalsIgnoreCase("ISO-8859-1")) { // Latin-1
encoding = "Windows-1252"; // Windows Latin-1
}

Latin-1 补丁可能很有用,因为任何操作系统上的所有浏览器都将 ISO-8859-1 解释为 Windows-1252;现在正式用于 HTML5。

关于java - 从 URL 获取内容返回奇怪的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31366426/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com