如何在Qt使用uchardet库

news2024/11/20 2:38:11

如何在 Qt 中使用 uchardet 库

文章目录

  • 如何在 Qt 中使用 uchardet 库
    • 一、简介
    • 二、uchardet库的下载
    • 三、在Qt中直接调用
    • 四、编译成库文件后调用
      • 4.1 编译工具下载
      • 4.2 uchardet源码编译
      • 4.3 测试编译文件
      • 4.4 Qt中使用
    • 五、一些小问题
      • 5.1 测试文件存在的问题
      • 5.2 uchardet库相关
    • 六、写在最后

一、简介

相信对编程熟悉的朋友有时候都会碰到这样一个问题——乱码

大家应该都知道,这是由于文件编码格式不正确导致的相关问题,即在文件编写和阅读的时候采取的编码格式不同,于是造成了我们阅读上的困难。

对于众多编译器,都有转文件编码与识别文件编码的相关功能,因此我们经常看到他们的身影。

在这里插入图片描述

如上图所示分别为 windows记事本、Notepad++、VsCode 所提供的文件编码格式识别。

而在网上搜索到的绝大多数方式是使用 python 中的 chardet 模块进行文件编码格式的判断。其实该库就是我们本次使用的 uchardet 库,其只是被开发者适配成了 python 版本。由于有关该库的 C++ 使用示例太少,所以就有了这篇文章,希望能给各位大佬提供思路!!!

那么我在这里简单介绍一下 uchardet 库。

uchardet(Universal Charset Detector)是一个强大的开源项目,它可以帮助我们自动识别文本的字符集编码。

uchardet 基于 MozillaCharDet 算法,该算法经过大量实际数据训练,具有高度的准确性。其核心功能是通过分析字节序列的统计特性,判断出最可能的字符编码类型,支持如 UTF-8、GBK、ISO-8859-1 等多种常见的字符集。

项目采用 C++ 编写,易于跨平台集成,并且拥有简洁的 API 接口,使得开发者可以轻松地将 uchardet 整合到他们的应用中。此外,项目还提供了 Python 绑定,方便 Python 开发者使用。

项目地址(下载方式后续过程中我会进行阐述,因此不用着急下载!!!):

  • BYVoid/uchardet: An encoding detector library ported from Mozilla (github.com)

  • uchardet / uchardet · GitLab

项目网站主页:

  • uchardet (www.freedesktop.org)

以上信息来源为以下文章,感谢作者分享!!

  • 探索高效字符检测:深入理解uchardet-CSDN博客

由此,我们对 uchardet 有了初步的认识,那么如何将其应用到项目工程中,是本文的重点。这里我将使用 Qt 对该库进行操作,同理使用 C++ 亦可实现。

在项目开始之前,简单介绍一下我所使用的配置环境:

开发平台:

  • Window 10
  • Qt 5.12.3

编译环境

  • MinGW 64-bit

二、uchardet库的下载

由于网上资料实在是太少,所以说下载也是一件难事,不过本文推荐以下下载方式:

Index of /software/uchardet/releases (www.freedesktop.org)

  • 如无法点击跳转可自行复制网址:https://www.freedesktop.org/software/uchardet/releases/

打开以后得到如下页面:

在这里插入图片描述

截至本文章撰写时间 2024/6/27,其版本更新到 0.0.8

而我们需要下载的是 uchardet-0.0.8.tar.xz,这是稳定的发行版,可以正常使用。这里对新手朋友说一句,不要直接从 Github 上下载,而要去里面的 Release 下载,否则,你下载的文件大概率无法运行。因为没有 Release 的项目,大概率正在开发,其中不免存在或多或少的问题,盲目尝试不会让我们事半功倍!!!

回归正题,对上述下载的文件解压以后得到如下图所示的文件结构。

在这里插入图片描述

那么到这里该库的源码下载完成!!!后续我们将对其进行使用。


三、在Qt中直接调用

这种方法可以实现功能,但不推荐。因为直接使用其源码文件导入到 Qt 中,会增加很多文件,对我们的阅读体验不是很好,但这里也做介绍,感兴趣的朋友可以阅读。

  1. 新建 Qt 项目,将 uchardet 源码中的 src 文件夹复制到 Qt 项目文件中:

    在这里插入图片描述

  2. 然后在 Qt 中按照如下步骤添加库文件:

    在这里插入图片描述

    如图所示,在项目文件夹上 右键,点击 Add Existing Directory

    在这里插入图片描述

    如图所示,对 uchardet.cpp 文件取消勾选。

    在这里插入图片描述

    对项目中已有的文件取消勾选!!!然后点击 OK,此时我的项目结构为:

    在这里插入图片描述

  3. 我在 UI 文件中创建了一个按钮,用来测试该库是否可行,如下所示:

    在这里插入图片描述

  4. 对按钮使用转到槽,实现其 released 槽函数。

    • widget.h 文件中进行如下更改:

      #ifndef WIDGET_H
      #define WIDGET_H
      
      #include <QWidget>
      
      #include <QFileDialog>
      #include <QDebug>
      
      /* 增加 uchardet 库头文件 */
      #include "src/uchardet.h"
      
      namespace Ui {
      class Widget;
      }
      
      class Widget : public QWidget
      {
          Q_OBJECT
      
      public:
          explicit Widget(QWidget *parent = nullptr);
          ~Widget();
      
      private slots:
          void on_pushButton_released();
      
      private:
          Ui::Widget *ui;
      };
      
      #endif // WIDGET_H
      
      
    • widget.cpp 文件中对按钮的槽函数进行实现

      /*! 
       *  @File        : widget.cpp
       *  @Brief       : 按钮槽函数
       *  @Details     : 详细说明
       *  @Param       : 参数
       *  @Return      : 返回值
       *  @Author      : Liu Jiahao
       *  @Date        : 2024-06-27 16:42:05
       *  @Version     : v1.1
       *  @Copyright   : Copyright By Liu Jiahao, All Rights Reserved
       *  
       */
      void Widget::on_pushButton_released()
      {
          QString filePath = QFileDialog::getOpenFileName(nullptr, "选择文件", "../", "所有文件 (*.*)");
      
          if (filePath.isEmpty()) {
              return;
          }
      
          QFile file(filePath);
      
          // 文件打开成功
          if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
              QByteArray buff = file.readAll();
      
              uchardet_t ud = uchardet_new();
              uchardet_handle_data(ud, buff.constData(), buff.size());
              uchardet_data_end(ud);
              const char* encoding = uchardet_get_charset(ud);
              QString result = QString::fromLatin1(encoding);
              uchardet_delete(ud);
      
              qDebug() << "该文件的编码格式为:" << result;
          }
      
          file.close();
      }
      
      

由此,完成了对该库的调用,这种方法较为简单,缺点就是会导入大量的源代码。

当我们运行程序点击按钮打开一个文件后,将会打印出该文件的编码格式,其运行结果如下图所示:

在这里插入图片描述

这里我做了一个简单的动图用于演示实现效果,如下所示:

在这里插入图片描述


四、编译成库文件后调用

Qt 中最常用的一般都是将所需库编译后调用,而 uchardet 也是可以进行这样的操作的,只不过实现起来有一点繁琐,需要我们自己进行编译。

4.1 编译工具下载

我们编译需要使用 MinGW-w64 进行编译,因此需要对该文件进行下载。

Releases · niXman/mingw-builds-binaries (github.com)

  • 如无法点击跳转可自行复制网址:https://github.com/niXman/mingw-builds-binaries/releases

截至本文章撰写时间 2024/6/27,其版本更新到 13.2.0

我们可以看到下图所示的内容:

在这里插入图片描述

各个版本有何区别,感兴趣的朋友可以自行搜索,这里将不再赘述!!!本文着重讲解如何使用 uchardet,望谅解!!!

这里我电脑是 64 位的,故我下载 x86_64-13.2.0-release-win32-seh-ucrt-rt_v11-rev0.7z,下载后解压得到以下文件信息:

在这里插入图片描述

任意一个盘都可以,我这里直接解压在了 C 盘,大家不要学我!!!

  • 尽量解压到一个自己好找的地方,后续需要使用这个地址!!!

然后打开 设置->系统->系统信息->高级系统设置->环境变量,按照图中所示步骤进行点击:

在这里插入图片描述

我这里电脑没有装中文,但界面几乎一致。

我之前将其解压到 C:/mingw64/ 目录下,因此这里我需要向环境变量中加入其 bin 文件,如下所示:

在这里插入图片描述

此时我们打开控制台(快捷键 win + R 后输入 cmd 最后回车),在其中输入 gcc -v 得到以下信息:

在这里插入图片描述

即证明安装完成,但还有一步需要操作。

打开 MinGW-w64 的安装目录,进入其 bin 文件,找到 mingw32-make.exe 文件将其复制一份重命名为 make.exe,如下所示:

在这里插入图片描述

这样做是为了我们后续使用命令时,能够方便的使用 make 命令,而不是 mingw32-make

此时再次使用控制台,输入 make -v 或者 mingw32-make -v 都能输出以下内容:

在这里插入图片描述

至此,结束安装编译工具的工作。接下来需要编译 uchardet 源码。

4.2 uchardet源码编译

同样打开控制台,这里我们需要提前将源码文件复制一份,这样方便我们出错后有回转的余地,而不是每次都要重新下载源码。我这里将复制的源码文件夹命名为 uchardet-copy,然后输入命令行,去到复制源码的文件夹,命令如下:

cd <复制后源码文件夹的路径>

运行结果如图所示:

在这里插入图片描述

此后依次输入以下命令:

mkdir build
cd build
cmake .. -G "MinGW Makefiles"
make

不出意外的话将会在 uchardet-copy/build/ 目录中生成类似的文件结构:

在这里插入图片描述

4.3 测试编译文件

后续一切操作都是基于我复制源码的文件夹,即 uchardet-copy 文件夹下的!!!

  1. 首先,需要我们进入 uchardet-copy/build/src 目录下找到 libuchardet.dll 文件,将其复制到 uchardet-copy/build/test 中:

    在这里插入图片描述

  2. 打开控制台,进入 uchardet-copy/build/test 目录中,同样使用 cd 命令:

    cd <写入自己文件路径>
    
  3. 然后在 uchardet-copy/build/test 目录中新建一个文件,我这里新建的 a.txt 文件,默认采用的是 UTF-8 编码格式,此时命令窗口中输入你想检测的文件,我使用以下命令行:

    uchardet-tests.exe a.txt
    

    得到以下内容:

    在这里插入图片描述

    可以看到其编码格式为 UTF-8,检测结果正确!

由此可以看到我们编译结果成功!!!其他编码格式相关的测试大家可以自行验证,这里不再赘述!!!

4.4 Qt中使用

通过上一步编译后我们已经得到了相关的 .a.dll 文件,其路径位于我上述所讲的 uchardet-copy/build/src 文件夹,将 .a 以及 .dll 复制到我们新建的 Qt 项目文件中。

这里需要注意的是,由于我电脑是64位的,我下载的 MinGW 也是64位版本,因此编译出的 dll 文件也是用于64位操作系统的。所以,建立 Qt 项目时,注意所需 Qt 编译环境,应当是 MinGw 64-bit!!!

除此之外,还需要添加 .h 文件,其路径位于 uchardet-copy/src 文件夹内,同样需要将其复制到我们自己的 Qt 项目文件夹中,我这里新建了文件夹 uchardet 并将相关文件复制在该文件中,如下所示:

在这里插入图片描述

然后我们需要在工程文件中导入该动态库(具体操作不予细说,这里只介绍重要部分)。

  1. 导入动态库:

    在这里插入图片描述

    具体在 .pro 文件中添加的东西为:

    win32: LIBS += -L$$PWD/uchardet/ -luchardet
    
    INCLUDEPATH += $$PWD/uchardet
    DEPENDPATH += $$PWD/uchardet
    
  2. 与本文第三小节类似,在 UI 文件中添加一个按钮:

    在这里插入图片描述

  3. 具体代码也与第三小节类似,这里简单赘述:

    widget.h 中有以下代码:

    #ifndef WIDGET_H
    #define WIDGET_H
    
    #include <QWidget>
    
    #include <QDebug>
    #include <QFileDialog>
    
    #include <uchardet/uchardet.h>
    
    namespace Ui {
    class Widget;
    }
    
    class Widget : public QWidget
    {
        Q_OBJECT
    
    public:
        explicit Widget(QWidget *parent = nullptr);
        ~Widget();
    
    private slots:
        void on_pushButton_released();
    
    private:
        Ui::Widget *ui;
    };
    
    #endif // WIDGET_H
    
    

    widget.c 文件中实现其槽函数:

    /*!
     *  @File        : widget.cpp
     *  @Brief       : 打开文件槽函数
     *  @Details     : 详细说明
     *  @Param       : 参数
     *  @Return      : 返回值
     *  @Author      : Liu Jiahao
     *  @Date        : 2024-06-28 14:43:15
     *  @Version     : v1.1
     *  @Copyright   : Copyright By Liu Jiahao, All Rights Reserved
     *
     */
    void Widget::on_pushButton_released()
    {
        QString filePath = QFileDialog::getOpenFileName(nullptr, "选择文件", "../", "所有文件 (*.*)");
    
        if (filePath.isEmpty()) {
            return;
        }
    
        QFile file(filePath);
    
        // 文件打开成功
        if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
            QByteArray buff = file.readAll();
    
            uchardet_t ud = uchardet_new();
            uchardet_handle_data(ud, buff.constData(), buff.size());
            uchardet_data_end(ud);
            const char* encoding = uchardet_get_charset(ud);
            QString result = QString::fromLatin1(encoding);
            uchardet_delete(ud);
    
            qDebug() << "该文件的编码格式为:" << result;
        }
    
        file.close();
    }
    
  4. 其运行结果也与第三小节类似,只是采用了不同的调库方式,这里就不再进行赘述。

值得注意的是,该库并不能确保百分百检测出的文件类型正确,同时,文件中如果没有文本信息,也是无法检测出来的。


五、一些小问题

在对该库的使用过程,也发现一些或多或少的小问题,在这一小节将进行阐述。

5.1 测试文件存在的问题

细心的朋友可能会注意到,在 uchardet/test 中有很多文件夹,如下所示:

在这里插入图片描述

其中均为不同语言的不同编码格式文件,例如 en 为英语,其中包含文件 ascii.txt,也就意味着该文件编码格式为 ascii,但是我们将此文件复制到 uchardet-copy/build/test 中进行测试的时候,发现其并不能输出任何东西,如下所示:

在这里插入图片描述

通过对 uchardet-copy/testuchardet-tests.c 文件的阅读,其中包含以下代码:

/* In a unit test, 0 means success, other returned values mean failure. */
success = (strcmp(charset, expected_charset) != 0);
if (success) {
    fprintf(stderr, "success: %d, Got %s, expected %s\n", success, charset, expected_charset);
}

通过对这代码的分析可以知道,charset 为检测出的文件编码格式类型,而 expected_charset 为期望的文件编码格式类型。再往上看,有以下代码:

expected_charset = strrchr(filename, '/');
if (expected_charset == NULL)
{
    expected_charset = filename;
}
else
{
    expected_charset++;
}
expected_charset = strtok(expected_charset, ".");

我们通过阅读这段代码,可以知道,其进行的操作是把你输入的文件名去后缀并保存起来,使其成为 expected_charset 变量。

那么上述问题迎刃而解,例如,我们输入的文件名是 ascii.txt,经过其检测后得出其编码格式为 ascii,那么对于 success = (strcmp(charset, expected_charset) != 0); 这一句代码而言,得到的结果 success 必定为 0,故没有输出。

可以看的出来,作者这样做的目的是,当文件编码格式和文件名相同时,判定为真,则不进行输出。当文件编码格式和文件名不相同时,判定为假,输出错误信息。

其实这对我们开发而言,并没有多大关系,也不影响我们使用这个库进行编码识别的操作,只是我在开发过程中遇到这个问题的一些感想。希望能对本文读者有所帮助!!!

5.2 uchardet库相关

由于编码格式众多且繁杂,且该库长时间没有进行更新,难免会有一些小问题,导致识别文件编码格式不准确。但这都是在我们可以承受的范围之内。

另外肯定有人好奇,我怎么知道这个库为什么这么用。实际上,我在网上找了大量资料,对于该库的描述实在是太少,偶然间看到一位大佬写的文章:C++ 自动检测编码_uchardet c++±CSDN博客

顿时恍然大悟,于是我也去查看了 Notepad++ 的源码文件:

在这里插入图片描述

并且,notepad++ 为了解决该库无法识别出 UTF-8 BOM、UTF-16BE BOM、UTF-16LE BOM 的问题,专门对这几个类型进行了单独的判断:

在这里插入图片描述

在这里插入图片描述

那么综合来讲,该库的性能以及使用体验还是不错的,大家感兴趣可以自行尝试。


六、写在最后

本文介绍了 如何在Qt中使用uchardet库,同时该库也可适用于C++。以及使用过程中存在的一些小问题

本文中的代码后续会逐步开源,欢迎关注,敬请期待!!!

欢迎广大读者提出问题以及修改意见,本人看到后会给予回应,欢迎留言,后续会逐步进行开源!!!
另外,由于文章是作者手打的文字,有些地方可能文字会出错,望谅解,也可私信联系我,我对其进行更改。

  • 个人CSDN账号:刘梓谦_-CSDN博客

  • Gitee:刘佳豪 (liu-jiahaohappy) - Gitee.com

  • GitHub:Jiahao-Liu29 (github.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1896213.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux关于文件的高级命令

tree命令 tree命令用于以树状图的形式显示目录结构。它可以帮助用户快速了解目录和文件的层次关系&#xff0c;非常适合用于浏览和理解大型文件系统的结构。 基础用法 显示当前目录的树状结构&#xff1a;tree 显示指定目录的树状结构&#xff1a;tree 指定目录路径 tree命…

比尔・盖茨谈AI市场狂热现象;腾讯推出TransAgents文学翻译框架

&#x1f989; AI新闻 &#x1f680; 比尔・盖茨谈AI市场狂热现象 摘要&#xff1a;微软联合创始人比尔・盖茨在《下一个伟大的构想》播客节目中表示&#xff0c;目前AI市场的狂热程度远超互联网泡沫&#xff0c;准入门槛低&#xff0c;融资额巨大&#xff0c;处于前所未见的…

大华设备接入GB28181视频汇聚管理平台EasyCVR安防监控系统的具体操作步骤

智慧城市/视频汇聚/安防监控平台EasyCVR兼容性强&#xff0c;支持多协议接入&#xff0c;包括国标GB/T 28181协议、GA/T 1400协议、部标JT808协议、RTMP、RTSP/Onvif协议、海康Ehome、海康SDK、大华SDK、华为SDK、宇视SDK、乐橙SDK、萤石云SDK等&#xff0c;并能对外分发RTMP、…

高效批量调整视频色彩:一键实现视频饱和与色度优化,提升视觉体验

在数字时代&#xff0c;视频已成为我们记录生活、分享故事的重要工具。然而&#xff0c;你是否曾因为视频色彩不够饱满、色度不够鲜明而感到困扰&#xff1f;今天&#xff0c;我要为你介绍一款神奇的软件——它能让你的视频色彩焕然一新&#xff0c;提升视觉体验&#xff0c;它…

uniapp+vue3+echarts编写微信小程序

uniappvue3echarts编写微信小程序 记录一下自己uniapp使用echarts开发图表&#xff0c;之前网上找了很多&#xff0c;本以为应该是挺常见的使用方式&#xff0c;没想到引入之路居然这么坎坷&#xff0c;在Dcloud插件市场&#xff0c;使用最多的&#xff1a;echarts-for-wx 但是…

前端面试题5(前端常见的加密方式)

前端常见的加密方式 在前端进行数据加密主要是为了保护用户的隐私和提升数据传输的安全性。前端数据加密可以采用多种方法&#xff0c;以下是一些常见的加密技术和方法&#xff1a; 1. HTTPS 虽然不是直接的前端加密技术&#xff0c;但HTTPS是保障前端与后端数据传输安全的基…

icopppppppppppppppppppp

写文章 深入理解Windows异步机制&#xff1a;IOCP的工作原理与应用 ​ 目录 收起 一、IOCP简介 二、IOCP工作流程 三、IOCP的使用 四、IOCP案例实战 五、常见问题和解答 Windows异步机制中的IOCP&#xff08;Input/Output Completion Port&#xff09;是一种高效的异步…

Linux Static Keys和jump label机制

文章目录 前言一、asm goto二、API使用2.1 低版本API2.2 高版本API 三、jump label四、源码分析4.1 数据结构4.2 static_key_false4.3 jump_label_init4.4 __jump_label_transform4.5 static_key_slow_inc/dec 五、__jump_table节5.1 内核5.2 内核模块 六、修改内存代码6.1 x86…

RAG 工业落地方案框架(Qanything、RAGFlow、FastGPT、智谱RAG)细节比对!CVPR自动驾驶最in挑战赛赛道,全球冠军被算力选手夺走了

RAG 工业落地方案框架&#xff08;Qanything、RAGFlow、FastGPT、智谱RAG&#xff09;细节比对&#xff01;CVPR自动驾驶最in挑战赛赛道&#xff0c;全球冠军被算力选手夺走了。 本文详细比较了四种 RAG 工业落地方案 ——Qanything、RAGFlow、FastGPT 和智谱 RAG&#xff0c;重…

2. 创建kvm虚拟机

创建kvm虚拟机 一、创建kvm虚拟机1、virt-manager 图形化工具2、virt-install 命令行工具3、查看虚拟机 一、创建kvm虚拟机 1、virt-manager 图形化工具 2、virt-install 命令行工具 [rootlocalhost ~]# virt-install --namevm02_centos79 \ > --graphics vnc,listen0.0.0…

AI产品经理能力模型的重点素质:人文素养和灵魂境界

在AI产品经理的能力模型中&#xff0c;我最想提的差异化关键点&#xff0c;就是“人文素养和灵魂境界”。 1 为什么“人文素养和灵魂境界”非常重要&#xff1f; 一、“人文素养和灵魂境界”如何影响AI产品设计&#xff1f; 例1&#xff1a;面对一个具体的AI场景&#xff0…

android deep links即scheme uri跳转以及googlePlay跳转配置

对于googlePlay的Custom URL就是googlePlay上APP网址&#xff1a; https://play.google.com/store/apps/details?idcom.yourapp如果是国内一些应用&#xff0c;则考虑market://包名等方式&#xff0c;自行百度。 对于Android URI Scheme&#xff1a; 首先需要在Manifest xm…

AR视频技术与EasyDSS流媒体视频管理平台:打造沉浸式视频体验

随着增强现实&#xff08;AR&#xff09;技术的飞速发展&#xff0c;其在各个领域的应用日益广泛。这项技术通过实时计算摄影机影像的位置及角度&#xff0c;将虚拟信息叠加到真实世界中&#xff0c;为用户带来超越现实的感官体验。AR视频技术不仅极大地丰富了我们的视觉体验&a…

Cortex-A510——内核及汇编

Cortex-A510——内核及汇编 小狼http://blog.csdn.net/xiaolangyangyang 1、异常等级 2、异常等级切换 同步异常&#xff1a; 1、SVC/HVC/SMC&#xff1b; 2、MMU引发的异常&#xff08;内核态EL1发生&#xff0c;发生后不会进行异常等级切换…

边界无限陈佩文:红蓝对抗安全演练常态化的各方分析

虽然常态化演练尚未正式开始&#xff0c;但我们仍然希望对各方的表现进行一些分析和预测&#xff0c;以辅助我们对市场的判断和决策。同时&#xff0c;也希望通过这些初步的见解&#xff0c;抛砖引玉&#xff0c;引发更多有价值的讨论和观点。 “船停在码头是最安全的&#xf…

深度学习1

1.支持向量机Support Vector Machine&#xff08;SVM&#xff09;是一种对数据二分类的线性分类器&#xff0c;目的是寻找一个超平面对样本进行分割&#xff0c;广泛应用人像识别&#xff0c;手写数字识别&#xff0c;生物信息识别。 二维空间分割界是一条直线&#xff0c;在三…

骨传导耳机哪个牌子好?总结五款好用骨传导耳机推荐!

在健康意识日益增强的今天&#xff0c;运动健身已成为连接身心健康的桥梁&#xff0c;而音乐则是这座桥上最动人的风景。然而&#xff0c;对于热衷于运动的人们而言&#xff0c;传统耳机往往难以胜任&#xff0c;其稳定性与卫生性问题成为一大痛点。 正当此时&#xff0c;骨传…

【机器学习】连续字段的特征变换

介绍 除了离散变量的重编码外&#xff0c;有的时候我们也需要对连续变量进行转化&#xff0c;以提升模型表现或模型训练效率。在之前的内容中我们曾介绍了关于连续变量标准化和归一化的相关内容&#xff0c;对连续变量而言&#xff0c;标准化可以消除量纲影响并且加快梯度下降…

vue 中 使用腾讯地图 (动态引用腾讯地图及使用签名验证)

在设置定位的时候使用 腾讯地图 选择地址 在 mounted中引入腾讯地图&#xff1a; this.website.mapKey 为地图的 key // 异步加载腾讯地图APIconst script document.createElement(script);script.type text/javascript;script.src https://map.qq.com/api/js?v2.exp&…