实习记录——中文编码问题

QString中文编码 QStringsCheckUpUrl(QString("seriesId=8&resourceCode=C0297&unit=t&name=%1&spec=12&price=3670").arg(QString::fromUtf8(QUrl::toPercentEncoding(QStringLiteral("螺纹@钢")))); QStringsGetWebSiteUrl =QString(" 阅读详情

这次是一个需求,系统需要支持中文的用户pin。
优惠券发放任务创建的时候可以上传txt文件到jss,
发放任务是一个定时任务,每隔三分钟遍历一边待发放任务,从jss上下载pin文件,遍历组装成一个pin的集合,然后根据pin集合发放优惠券。
因此中文编码问题主要出现在从jss上获取输入流读取数据,并正确解析,转成utf-8格式

txt主要有ANSI、UTF-8、Unicode编码
因此首先需要判断这个文件是什么编码格式的,才能正确解析。

附上判断编码格式代码:

private static  String getFilecharset(BufferedInputStream bis) throws IOException {
        String charset = "GBK";
        byte[] first3Bytes = new byte[3];
            boolean checked = false;
            bis.mark(0);
            int read = bis.read(first3Bytes, 0, 3);
            if (read == -1) {
                return charset;  //文件编码为 ANSI
            } else if (first3Bytes[0] == (byte) 0xFF
                    && first3Bytes[1] == (byte) 0xFE) {
                charset = "UTF-16LE"; //文件编码为 Unicode
                checked = true;
            } else if (first3Bytes[0] == (byte) 0xFE
                    && first3Bytes[1] == (byte) 0xFF) {
                charset = "UTF-16BE"; //文件编码为 Unicode big endian
                checked = true;
            } else if (first3Bytes[0] == (byte) 0xEF
                    && first3Bytes[1] == (byte) 0xBB
                    && first3Bytes[2] == (byte) 0xBF) {
                charset = "UTF-8"; //文件编码为 UTF-8
                checked = true;
            }
            bis.reset();
            if (!checked) {
                int loc = 0;
                while ((read = bis.read()) != -1) {
                    loc++;
                    if (read >= 0xF0)
                        break;
                    if (0x80 <= read && read <= 0xBF) // 单独出现BF以下的,也算是GBK
                        break;
                    if (0xC0 <= read && read <= 0xDF) {
                        read = bis.read();
                        if (0x80 <= read && read <= 0xBF) // 双字节 (0xC0 - 0xDF) (0x80 - 0xBF),也可能在GB编码内
                            continue;
                        else{
                            break;
                        }
                    } else if (0xE0 <= read && read <= 0xEF) {// 也有可能出错,但是几率较小
                        read = bis.read();
                        if (0x80 <= read && read <= 0xBF) {
                            read = bis.read();
                            if (0x80 <= read && read <= 0xBF) {
                                charset = "UTF-8";
                                break;
                            } else{
                                break;
                            }
                        } else{
                            break;
                        }
                    }
                }
            }
        return charset;
    }

获取到编码格式之后,我们就可以使用这个编码格式读取数据,并且转换成UTF-8格式
如下;

decodein = os.get().getInputStream();
in = os.get().getInputStream();
String oldCharset = getFilecharset(new BufferedInputStream(decodein));
reader = new BufferedReader(new InputStreamReader(in,oldCharset));
String pin = null;
while ((pin = (reader.readLine())) != null) {
    pins.add(pin);
}

为何出现了读取数据为空的情况?
附上产生这个bug的代码;

in = os.get().getInputStream();
//检验编码格式
String oldCharset = getFilecharset(new BufferedInputStream(in));
reader = new BufferedReader(new InputStreamReader(in,oldCharset));
while ((pin = (reader.readLine())) != null) {
    pins.add(pin);
}

这个问题排查了两天,从各种编码问题到jss问题
结果竟然是很简单的原因: inputStream调用了两次
原本我以为使用BufferedInputStream、InputStreamReader封装了inputStream之后就是新的一个流了,毕竟使用了new 。结果发现其实都是封装了同一个inputStream。

这个问题其实很简单,但是很容易被忽视。

Qt当中的中文编码问题 在Qt中,有个很烦人的问题就是编码问题。如果你碰到传入路径或者一些中文字符串时,发现卡死了,或者乱码,那么建议你多加仔细排查编码问题。有时候不同的PC采用不同的编码方式,比如utf-8, GB2312...很可能在你本电脑上正常,换了一台电脑就不行。我就吃过这种暗亏。那么如何避免这些暗亏呢? 首先开发时,对于qtcreator编译器安装或者说第三方插件安装最好路径不带中文,环境变量的设置也不建议有中文出现,甚至于在你的代码里注释都不建议有中文,只要不出现中文,那么你出问题的时候就少了一个隐患。不然你. 阅读详情

相关推荐

【AI实战派】从零部署YOLOv8:香橙派AIpro边缘端目标检测全流程解析

本文详细解析了在香橙派AIpro边缘设备上从零部署YOLOv8目标检测模型的全流程。内容涵盖硬件开箱、环境搭建、模型转换(ONNX到昇腾OM格式)以及编写Python推理脚本,并提供了性能优化与实战技巧,帮助开发者高效实现实时边缘AI应用。

weixin_29183637的博客 332

Java:判断文件的编码,并转换为ANSI

package com; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundE...

zale_ZY的博客 2344

RAGFlow源码解析-2、从源码构架ragflow v0.25.0镜像

本文详细记录了从零开始构建自定义RAGFlow镜像lt/ragflow:0.25.0的全过程。首先介绍了环境准备,包括检查Node.js、Docker版本和项目结构。然后详细说明了构建步骤:编译前端、创建自定义Dockerfile、构建镜像和验证。接着讲解了docker-compose配置修改要点,包括网络定义、MySQL依赖处理等。最后总结了部署过程中遇到的五个关键问题及解决方案,包括networks未定义、MySQL服务依赖、tiktoken文件缺失、数据库配置错误和端口映射问题。通过完整的操作流程和问

liutao841204的专栏 364

判断文件的编码

首先,不同编码的文本,是根据文本的前两个字节来定义其编码格式的。定义如下:ANSI:        无格式定义;Unicode:       前两个字节为FFFE;Unicode big endian: 前两字节为FEFF; UTF-8:        前两字节为EFBB; 知道了各种编码格式的区别,写代码就容易了. publicstaticStringget_charset(Filefile)...

shinfocom 142

逆向解析手淘x-sign签名算法:从抓包到API调用的完整实践

本文详细解析了手淘x-sign签名算法的逆向过程,从抓包工具选择到API调用实践,提供了完整的解决方案。通过分析签名参数组成和生成机制,帮助开发者理解并实现淘宝接口的合法调用,同时强调了安全与合规的重要性。

weixin_29323273的博客 608

Arduino蜂鸣器播放《Astronomia》:从乐谱到代码的嵌入式音乐实现

在嵌入式系统开发中,通过编程控制硬件执行特定任务是核心基础。其原理在于利用微控制器生成精确的时序和频率信号,驱动执行器(如蜂鸣器、电机)完成预定动作。这项技术的价值在于实现了软件逻辑与物理世界的直接交互,是物联网设备、智能硬件开发的基石。常见的应用场景包括电子玩具的音效生成、报警器设计以及交互式艺术装置。本文以热门歌曲《Astronomia》的播放为例,具体展示了如何运用Arduino的`tone()`函数和数组数据结构,将抽象的乐谱转化为可执行的频率与延时控制代码,完整呈现了从**核心硬件解析**到**软

weixin_29796279的博客 348

JAVA上传文件获取文件编码格式

private static String getFilecharset(InputStream inputStream) {         String charset = "GBK";         byte[] first3Bytes = new byte[3];         try {             boolean checked = false;

qq_34858027的博客 3304

智能座舱SoC平台横评:SA8155P、SA8255P、SA8295P、MT8678、MT8628 谁是下代车机首选?

高通SA8295P以PC级架构、强悍AI算力,代表安卓阵营迈向“本地大模型+空间计算”阶段;联发科MT8678则凭借低功耗 + 高带宽,成为副驾多媒体/副屏智能化的性价比之王。在座舱设计中,SoC平台决定了你能给用户什么样的交互方式,选型时切忌只看跑分,而要回归“体验-热设计-平台生态”的三角平衡。

weixin_43199439的博客 3359

获取文件编码

此文章是从我自己iteye博客弄过来的 不管上传还是下载都会用到流来处理,但在处理过程中,多多少少会遇到乱码的问题,这里提供如何获取文件编码的方法(网上转载的,源地址忘了,这里对原作者说声不好意思,在这里记录下来,方便查阅),知道文件编码以后,对文件的处理就方便了。上代码 /** * 获取文件编码 * @param sourceFile * @retur

D1208的专栏 695

2025小红书爬虫还能活?破解x-s签名+动态Cookie,亲测爬1000条笔记零封禁(附逆向全过程)

上周帮美妆行业的朋友爬小红书“口红推荐”笔记,刚发30个请求就被403,抓包一看x-s签名不对;换Cookie继续爬,爬50条又被封——小红书的反爬这两年简直是“地狱模式”:动态Cookie每10分钟过期,x-s签名算法季度更新,连请求头的User-Agent顺序错了都会被拦。。这篇文章不藏私,把逆向x-s签名的全过程、动态Cookie的维护技巧、1000条稳定爬取的实战代码全给你,连我踩过的8个坑都标出来了(最后附代理池配置,IP零封禁的关键)。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 7412

系统架构设计师备考攻略

计算机软件资格考试是由国家人力资源和社会保障部、工业和信息化部领导下的国家级考试。 软考没有学历、专业、年龄、相关工作经验要求,你可以根据自身选择合适的去报名(也就是说你直接直接报高级),但是一次考试只能报一种。 计算机软件资格考试纳入全国专业技术人员职业资格证书制度的统一规划,实行统一大纲、统一试题、统一标准、统一证书的考试办法,每年举行两次。通过考试获得证书的人员,表明其已具备从事相应专业岗位工作的水平和能力,用人单位聘任相应专业技术职务(助理工程师、工程师、高级工程师)。

帅次的博客 7180

C# HttpRequest 中文编码问题

工作中的项目要用到别家的网络短信平台,工作中遇到中文编码的问题,特总结以备忘。 GET方法: public string DoWebRequest(string url)         {             HttpWebResponse webResponse = null;             HttpWebRequest webRequest = (HttpWebRequ

~~~~ 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

python解决中文编码问题

python解决中文编码问题    摘要:因为这段时间做python的中文数据梳理和爬虫,中文数据处理花费了我大量的时间,暂时不做这一块所以留下一些记录。为了快速完成文章,这里对很多文章进行了引用和摘抄,敬请原谅。  目录:  1.编码的基础知识  2.str与unicodedecode和encode  3.读取文件中出现的乱码问题  4.获取当前环境下默认编码                  ...

博客 1万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

python中文编码问题解决

python解决中文编码问题 摘要:因为这段时间做python的中文数据梳理和爬虫,中文数据处理花费了我大量的时间,暂时不做这一块所以留下一些记录。为了快速完成文章,这里对很多文章进行了引用和摘抄,敬请原谅。 目录: 1.编码的基础知识 2.str与unicodedecode和encode 3.读取文件中出现的乱码问题 4.获取当前环境下默认编码 交流圈 https://jq.qq.com/?_w...

weixin_45625815的博客 455

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Qt工作笔记-三种方式解决Qt5中文编码问题

目录 前言 方式一 方式二 方式三 三种方式解决Qt5中文编码问题 前言 这里不谈原理,只说如何去做! 这里本人自己总结下,今天遇到了新的编码问题,在此记录下,方面以后快速调用。 把这三种方法顺序试下,基本上就可以解决问题。 这里是编译成功情况下,界面运行字符串乱码,或者字符全部挤在一起(姑且叫挤在一起吧); 方式一 QString::fro...

IT1995的博客 5708

同步与异步下载图片,解决URL中文编码问题

同步爬虫 import requests from lxml import etree from queue import Queue from urllib import request import os import re def parse_page(url): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT...

jstang的博客 3634

中文编码杂谈

中文编码杂谈 桂南 编码问题的例子 在windows自带的notepad(记事本)程序中输入“联通”两个字,保存后再次打开,会发现“联通”不见了,代之以“��ͨ”的乱码。这是windows平台上典型的中文编码问题。即文件保存的时候是按照ANSI编码(其实就是GB2312,后面会详细介绍)保存,打开的时候程序按照UTF-8方式对内容解释,于是就出现了乱码。避免乱码的方式很简单,

似水流年 -- 韩欣的博客 1370

深入分析 Java 中的中文编码问题

深入分析 Java 中的中文编码问题,看完豁然开朗,比较懒就不转载了,记录下网址。

floating_fight的博客 267

python列表中中文编码的问题

在python2列表中,有时候,想打印一个列表,会出现如下显示: 这个是由于: print一个对象,是输出其“为了给人(最终用户)阅读”而设计的输出形式,那么字符串中的转义字符需要转出来,而且 也不要带标识字符串边界的引号。 因此,单独打印列表中的某一项,譬如:list[0],他可以很好的转义出中文字符。而一个list对象,本身就是个数据结构,如果要把它显示给最终用户看,它不会对里面

qq_16620269的博客 1946

python中中文显示_python中的中文编码问题

一、引言无论学习什么程序语言,字符串这种数据类型总是着有非常重要。然而最近在学习python这门语言,想要显示中文,总是出现各种乱码。于是在网上查了很多资料,各说纷纭,我也尝试了许多的方法,有时候可以正常显示,有时候确实乱码,让我摸不着头脑。于是自己利用python读写中文的文本文件来尝试去摸索python中的中文编码问题。比较幸运的是,最后能够正常的读取出文本里面的中文数据并且显示,而且还能将中...

weixin_39624332的博客 481

python-django的中文编码总结

最近在使用django的过程中,发现之前对中文编码的理解并不怎么正确,在此记录一下。 1.在所有需要显式使用中文的地方加上#-*- coding: UTF-8 -*-标识,(包括注释中的中文和代码中字符串的中文)  2.django在db中存储的数据是经过encode的,但是通过模型取出的数据,是经过decode的。  3.python中在进行字符串连接的时候,必须保证所有的子字符串编码

495

c++hextostring不能显示中文_Mathematica CCompilerDriver的两个中文编码问题

为了加速Mathematica程序,可以使用Compile[]为变量指定机器类型,得到一个高效运行的函数。Compile有一个选项CompilationTarget,默认值"WVM",可选"C"。"WVM"生成Wolfram虚拟机代码,"C"使用一个外部C编译器,生成native机器代码。在我使用CompilationTarget->"C"时,定位了两处中文编码问题,网络上还未见讨论过,这篇...

weixin_31440583的博客 285

Dockerfile设置时区和中文编码记录

Dockerfile设置时区和中文编码 设置时区 ... #定义时区参数 ENV TZ=Asia/Shanghai #设置时区 RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo '$TZ' > /etc/timezone ... 设置中文编码 ... # 中文支持 RUN yum -y install kde-l10n-Chinese RUN yum -y install glibc-common RUN l

憧憬001-的博客 1658

python中的中文编码问题

一、引言   无论学习什么程序语言,字符串这种数据类型总是着有非常重要。然而最近在学习python这门语言,想要显示中文,总是出现各种乱码。于是在网上查了很多资料,各说纷纭,我也尝试了许多的方法,有时候可以正常显示,有时候确实乱码,让我摸不着头脑。于是自己利用python读写中文的文本文件来尝试去摸索python中的中文编码问题。比较幸运的是,最后能够正常的读取出文本里面的中文数据并且显示,而且还...

weixin_34124577的博客 129
上一篇: Spring——bean的生命周期
下一篇: jar包升级版本号引发的问题
HY_Chan
博客等级 码龄10年 54粉丝 60原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值