怎么精准的获取网页编码,并转成UTF8



function htmlConvertEncode($html){
    // 检测编码
    $encode = mb_detect_encoding($html, array("ASCII","UTF-8","GB2312","GBK","CP936","BIG5","EUC-CN"));
    // 转码
    if($encode != 'UTF-8'){
        return mb_convert_encoding($html, 'UTF-8', $encode);
    }
    // 返回字符集
    if('UTF-8' === true){
        return $encode;
    }
    return $html;
}

我这个代码有个问题,就是少数的网页检测不出来编码。或者有没什么办法,能把所有非UTF8的代码转成UTF8?最好能全面点的

引用chatgpt部分指引作答:
您可以尝试使用以下代码,以确保从任何编码转换为UTF-8,并获取网页的准确编码:

function htmlConvertEncode($html){
    // 获取字符集
    $encode = '';
    preg_match('/<meta.+?charset=["\']?([-\w]+)/i', $html, $matches);
    if(!empty($matches)){
        $encode = strtoupper($matches[1]);
    } else {
        $encode = mb_detect_encoding($html, array("ASCII","UTF-8","GB2312","GBK","CP936","BIG5","EUC-CN"));
    }
    // 转码
    if($encode != 'UTF-8'){
        $html = iconv($encode, 'UTF-8//IGNORE', $html);
    }
    return $html;
}

此函数首先检查是否存在meta标记,如果有,则从中提取编码。否则,使用mb_detect_encoding函数检测编码。接下来,使用iconv函数将HTML转换为UTF-8编码。

请注意,这种方法仅适用于HTML文档中存在meta标记的情况。如果网页中没有meta标记,则可能需要更复杂的技术来检测编码。

另外,请注意,这个函数在转换编码时使用了//IGNORE选项,以确保无效的字符不会导致错误。但是,这也可能会导致一些信息的丢失,所以请注意使用。

引用chatgpt部分指引作答:

可以使用以下代码获取网页编码并转换为UTF-8:

1、获取网页编码:

function getCharset($html) {
    preg_match('/<meta.+?charset=[^\w]?([-\w]+)/i', $html, $matches);
    if (isset($matches[1])) {
        return strtolower($matches[1]);
    } else {
        // 如果<meta>标签中没有指定编码,则使用以下默认值
        return 'utf-8';
    }
}

2、将编码转换为UTF-8

function convertToUTF8($html, $encoding) {
    $html = mb_convert_encoding($html, 'HTML-ENTITIES', $encoding);
    $html = mb_convert_encoding($html, 'UTF-8', 'HTML-ENTITIES');
    return $html;
}

使用方法:

$url = 'http://www.example.com/';
$html = file_get_contents($url);

$encoding = getCharset($html);
$html = convertToUTF8($html, $encoding);

其中,$url 是要获取的网页地址,$html 是获取的网页内容。getCharset 函数用于获取网页编码,convertToUTF8 函数用于将编码转换为UTF-8。最后,$html 就是转换后的UTF-8编码的网页内容了。

java爬取网页Unicode转UTF-8中文

可以借鉴下
https://blog.csdn.net/weixin_30596165/article/details/95598869

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/743887
  • 除此之外, 这篇博客: 为什么写代码要用UTF-8编码格式?中的 参考文献 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 【1】百度百科 - ASCII

  • 以下回答由chatgpt基于相关博客总结生成:

    解决方案:

    1. 获取网页编码:

    在解析网页之前,可以使用Python的requests库获取网页响应头中的Content-Type信息,其中就包括了网页所使用的编码方式。例如:

    import requests
    
    #url为待获取编码方式的网址
    response=requests.get(url)
    content_type=response.headers['Content-Type']
    #由于编码方式会包含在Content-Type信息的charset字段中,因此可以使用find函数查找该字段的位置
    charset_pos=content_type.find('charset')
    #编码方式一般写在charset后面,因此可以在该位置后面查找编码方式
    if charset_pos!=-1:
        charset=content_type[charset_pos+len('charset'):]
        #将字符串中的空格去除
        charset=charset.strip()
    #如果找不到编码方式,则使用默认编码方式
    else:
        charset='UTF-8'
    
    1. 将网页内容转换为UTF-8编码:

    将网页内容转换为UTF-8编码的方法取决于网页本身的编码方式。如果能够获取到网页的编码方式,则可以使用Python内置的编码转换方法进行转换。例如:

    import requests
    
    #url为待获取内容的网址
    response=requests.get(url)
    content_type=response.headers['Content-Type']
    #由于编码方式会包含在Content-Type信息的charset字段中,因此可以使用find函数查找该字段的位置
    charset_pos=content_type.find('charset')
    #编码方式一般写在charset后面,因此可以在该位置后面查找编码方式
    if charset_pos!=-1:
        charset=content_type[charset_pos+len('charset'):]
        #将字符串中的空格去除
        charset=charset.strip()
    #如果找不到编码方式,则使用默认编码方式
    else:
        charset='UTF-8'
    
    #将响应内容转换为字符串
    str_content=response.content.decode(charset,errors='ignore')
    #将字符串转换为UTF-8编码
    utf8_content=str_content.encode('UTF-8',errors='ignore')
    

    如果不能获取到网页的编码方式,则可以考虑使用第三方库chardet来自动探测网页的编码方式。chardet是一个Python库,可以通过分析文本数据来自动猜测编码方式。例如:

    import requests
    import chardet
    
    #url为待获取内容的网址
    response=requests.get(url)
    #使用chardet库自动探测网页的编码方式
    charset=chardet.detect(response.content)['encoding']
    #将响应内容转换为字符串
    str_content=response.content.decode(charset,errors='ignore')
    #将字符串转换为UTF-8编码
    utf8_content=str_content.encode('UTF-8',errors='ignore')
    
    1. 将所有非UTF-8编码的网页内容转换为UTF-8:

    如果不能获取到网页的编码方式且使用chardet库也无法自动猜测到编码方式,就只能考虑将所有非UTF-8编码的网页内容转换为UTF-8。这个过程就需要先判断网页内容的编码方式,然后分别进行转换。具体方法可以参考第2条解决方案中的代码示例,不过需要额外添加一个循环来对所有可能的编码方式进行逐一测试。