V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  chinaguaiu  ›  全部回复第 4 页 / 共 10 页
回复总数  197
1  2  3  4  5  6  7  8  9  10  
239 天前
回复了 tuoov 创建的主题 宽带症候群 请教我设置 WSL2 网络代理
老实说我就是像你这么干的,就是每次启动 wsl 都要看/etc/resolv.conf 很折磨
240 天前
回复了 672795574 创建的主题 上海 上海现在自行车小区内被偷的情况多吗?
🥵看见村里有人撬了好几辆美团单车放家门口
240 天前
回复了 lstz 创建的主题 问与答 如果能回到过去,你最想回到哪一年?
2012 ,刚上初中
无关痛痒的 bug 直接说了,业务 bug 直接改了,功能性 bug 先问清楚🥵
半懂不懂不知道是不是 bug 的就不说话
251 天前
回复了 GunsRose 创建的主题 问与答 邻居早上扰民怎么办?
一说老阿姨,一说蛮不讲理,一说租房,我就猜是上海,哈哈,真猜中了🤣🤣🤣
我都不会写的,国内没意义,会听说就行
中文博客平台完了 https://i.imgur.com/e1q9ScT.png
我工作坐牢半年了,这还是换了份工作,上一份工作简直是禁闭室😭
@gransh 哪怕不标记也可以看参数估计一下,好像是什么缓存参数,以前折腾过,时间太久我也忘了。说实话冷备的话是否垂直和叠瓦有点无所谓,可能周边的配件和接线坏了你的盘还没坏,很多时候是配件坏了导致硬盘使用不了(仅局限于消费级产品),与其纠结是不是叠瓦是不是垂直还不如看看配件好不好,多看看购物评论就可以看出来。
261 天前
回复了 FlechazoQaQ 创建的主题 问与答 家庭煮夫们来给点建议吧
@FlechazoQaQ #34 那就上一个大冰箱吧,一定要够大
262 天前
回复了 FlechazoQaQ 创建的主题 问与答 家庭煮夫们来给点建议吧
我只关心厨房。问两个问题,楼主厨艺如何?厨房面积如何?🥵🥵🥵说实话这两点比厨具稍微重要一些
262 天前
回复了 FlechazoQaQ 创建的主题 问与答 家庭煮夫们来给点建议吧
你的文具..啊,不对,厨具好多啊
262 天前
回复了 datocp 创建的主题 iPad 大学上课做笔记请问 iPad 该怎么选择
买 mini 吧,进可做笔记,退可打游戏
265 天前
回复了 yuey286 创建的主题 计算机 这套电脑配置单如何 总价 1.4w
硬盘和内存是不是小气了点
xbox 原装。后来摸了一下同事买的 300 多的北通,很辣鸡。
268 天前
回复了 gomorebug 创建的主题 职场话题 大三下找实习 | 简历求狠批
项目经验多写点,多写设计思路和细节。技能特长写少一点吧,哎,看见这些就头大。
268 天前
回复了 tiRolin 创建的主题 Java maven 总是无法正确导入依赖问题求解答
有可能是废文件导致的。到本地的 maven 仓库删掉对应的包文件夹可以强制让 maven 在下一次拉依赖时重新下载更新。例如 fastjson 在:C:\Users\用户名\.m2\repository\com\alibaba\fastjson\2.0.2

你可以某个版本号的文件夹删了,或者直接把 fastjson 这个文件夹删了,或者更激进一点把 alibaba 这个包删了,甚至 com 包、repository 。总之,这样做相当于把本地 maven 仓库缓存的文件删掉,有时候 maven 拉取依赖失败了会在本地仓库留下废文件占用了名称路径,这时候就需要使用这种方法手动清理废文件。
@rookiemaster #18
utf-32 类型的话,框架和浏览器都可能会出现问题,可能需要逐一排除。


框架问题
-----------
utf-32 这个编码类型用的比较少,开发者一般是直接使用 utf-8 的,所以你首先还是需要通过抓却流量确定框架真的按照你指定的 utf-32 格式进行了编码。windows 下建议使用 Wireshark 工具进行抓取分析。
我模拟帮你抓取了一下流量,如下代码和配置下:

// 配置:server.servlet.encoding.charset=utf-32
// server.servlet.encoding.force-response=true
@GetMapping("/hello-encode")
public String sayHelloByString() {
return "你好,世界。";
}

抓取到的流量分析出来框架没有直接使用 utf-32 进行编码,而是使用了 utf-32be 进行编码;同时,该报文中的 Content-type 仍然指定 charset=UTF-32 ,显然导致了浏览器乱码问题(浏览器是按照 charset 指定的格式进行解码的,除非格式不支持)。我的环境是 spring-boot 3.1.5 。


浏览器问题
-----------
如果确实框架确实使用了你指定的格式进行编码并且发送数据到浏览器,才进一步考虑浏览器是否支持该编码类型;如果该浏览器不支持报文中 charset 字段指定的编码类型,那么浏览器会忽略掉 charset 字段并按照算法选取一个编码格式进行解析,显然,也容易出现乱码。各家浏览器对这个默认选取的编码格式不一样,你可以在 F12 的开发者工具控制台中输入 document.charset 或者 document.characterset 查看当前使用的编码。

我使用谷歌浏览器,上述所说的响应报文返回到浏览器后发生了乱码,我在控制台输入 document.charset 显示编码类型为 windows-1252 ,显然我的浏览器不支持 utf-32 类型。
@chendy 我钻牛角尖研究过,

对于 2:是否带上 charset 字段已经成了历史遗留问题,大部分浏览器的做法是符合规范的话就适用 charset 字段指定的编码,如果不符合规范(例如说对图片类型数据也指定了 charset),就忽略(无论有没有填上 charset 字段)。见 https://datatracker.ietf.org/doc/html/rfc6657#page-3 , 该建议标准提到应尽量弱化媒体类型(尤其是 text/*类型)对 charset 字段的依赖。

对于 3:JSON 文件强制使用 UTF-8 编码。见 https://www.rfc-editor.org/rfc/rfc8259.html#section-8.1 ,"JSON text exchanged between systems that are not part of a closed ecosystem MUST be encoded using UTF-8 [RFC3629]."
先说结论:charset 字段不对 application/json 类型的媒体内容生效,无论你怎么设置 charset ,框架都只会使用 utf-8 对字符串进行编码。charset 字段只用于 text/* 类型的媒体内容生效,也就是文本内容; application/*类型的数据在规范上属于二进制数据,不应受 charset 制约(框架和浏览器会直接忽略 charset )。

如果一定要用 GBK 传输数据,不要给 Spring 框架返回 Collection 例如 Map 类型,而是直接返回 String 类型。无论是返回哪种类型都不需要你手动进行编码了,框架会自动处理的。

// @RestController 注解会自动将 map 转化为 json 并使用 utf-8 编码
// http 响应的媒体类型为 application/json
@GetMapping("/hello-json")
public Map sayHelloByJSON() {
Map map = new HashMap<String, String>();
map.put("你好", "世界");
return map;
}

// 按照指定的编码传输文本数据
// http 响应的媒体类型为 text/*,具体类型要看框架的处理
@GetMapping("/hello-gbk")
public String sayHelloByGbkString() {
return "你好,世界。";
}


-------
1. charset 字段对 text/*文本类型的影响,见: https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types
"例如,对于主类型为 text 的任何 MIME 类型,可以添加可选的 charset 参数,以指定数据中的字符所使用的字符集"

2. JSON 文件(文本)应该使用 applicaiton/json 媒体类型进行描述,见: https://www.iana.org/assignments/media-types/media-types.xhtml 。使用 text/*类型描述 json 文本被认为是违反规范的。

3. applicaiton/json 类型的数据不应受 charset 字段影响,见: https://datatracker.ietf.org/doc/html/rfc6838#section-4.2.1
该段有提到两点:
( 1 ). 包含“payload”的文本类型不应该使用 charset 字段,而应该由本身的规范指定(例如 xml 文件内部有编码集指定字段, 而 JSON 文件唯一指定为 utf-8 , 见 https://www.rfc-editor.org/rfc/rfc8259.html ),它们不应该受 charset 字段影响(直接忽略 charset,无论 charset 是否存在)
( 2 ). 如果一定要使用一种默认编码,使用“UTF-8”。
application/json 数据其实算是二进制数据,但是可以认为是上文所说"包含`payload`的文本类型".
------


嘛,应该挺多人对 json 数据胡乱进行处理的,乱码嘛,正常。
op 有兴趣的话可以看看这个讨论: https://github.com/libwww-perl/HTTP-Message/pull/90
讨论核心就是应该如何看待并处理 http 请求中的 json 类型"文本"(从浏览器和框架的角度)。对本问有一定的参考意义。
1  2  3  4  5  6  7  8  9  10  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   944 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 33ms · UTC 21:28 · PVG 05:28 · LAX 13:28 · JFK 16:28
Developed with CodeLauncher
♥ Do have faith in what you're doing.