-
Notifications
You must be signed in to change notification settings - Fork 55
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix setlocale bug on unicode.md #61
base: main
Are you sure you want to change the base?
Conversation
人生的第一个 PR |
> 对于 Unix-like 系统,由于其默认使用 UTF-8 编码,因此提供一个空字符串接受本地 locale 即可达到本地化的效果。
错误的,unix系统用户同样可以设置export LC_ALL=zh_CN.GB2312,这时设置空字符串就会变成zh_CN.GB2312
无法顺畅的大口呼吸,是活着的最好证明
…---Original---
From: ***@***.***>
Date: Tue, Oct 29, 2024 18:57 PM
To: ***@***.***>;
Cc: ***@***.***>;
Subject: [parallel101/cppguidebook] fix setlocale bug on unicode.md (PR #61)
setlocale 的 .utf-8 参数是 Windows 10 version 1803 (10.0.17134.0) 新加入的,不支持其他系统。这里提供一个godbolt 链接展示此问题。
对于 Unix-like 系统,由于其默认使用 UTF-8 编码,因此提供一个空字符串接受本地 locale 即可达到本地化的效果。
Windows .utf-8 参考链接
You can view, comment on, or merge this pull request online at:
#61
Commit Summary
2d01cda unix 系统 setlocale 示例错误
File Changes
(1 file)
M docs/unicode.md (2)
Patch Links:
https://github.com/parallel101/cppguidebook/pull/61.patch
https://github.com/parallel101/cppguidebook/pull/61.diff
—
Reply to this email directly, view it on GitHub, or unsubscribe.
You are receiving this because you are subscribed to this thread.Message ID: ***@***.***>
|
但是这样确实做到了本地化,虽然对于非 UTF-8 的用户会出现问题,但是数量估计跟大熊猫有的一拼,并且这些人遇到的字符编码问题估计不止一次。 |
setlocale(“”)是不行的,因为很多linux发行版默认的LC_ALL=C,而setlocale(“C”)会让编码格式为ASCII,使得iswspace无法判断全角空格,wcout无法输出unicode字符等。依然需要setlocale(“C.utf-8”)才能让全局函数支持unicode字符。 |
并不是,默认都是 ASCII 编码,只不过因为大多数图形安装的发行版在选择语言的一步中就会替你设置LANG和LC_ALL,看起来好像“所有的发行版都是UTF-8”一样。我安装Arch Linux后没有经过手动配置前,就是LC_ALL=C的。 我知道.utf-8是win10某个版本引入的,确实需要提一嘴这个在之前没有支持,我的问题,但是我不认为“”是更好的选择,使用“”意味着代码里所有的字符串常量都需要为L开头的宽字符串,统一使用wcout系列接口和系统打交道,我不认为有开发者做得到,也不认为第三方库做得到。 |
程序会在启动的时候执行一次 |
修正一下, |
直接setlocale(LC_ALL, “.utf-8”)不就完了吗?为什么要和环境变量过不去?所有企图和环境耦合的程序总是会在交付时产生大量恼人的用户反馈,我不是没碰到过。解决所有utf8不支持问题,且wendous和主流linux发行版都适用,如果是其他unix类系统,通过宏判断一下改为C.utf-8即可。
无法顺畅的大口呼吸,是活着的最好证明
…---Original---
From: ***@***.***>
Date: Thu, Oct 31, 2024 11:29 AM
To: ***@***.***>;
Cc: ***@***.******@***.***>;
Subject: Re: [parallel101/cppguidebook] fix setlocale bug on unicode.md (PR#61)
程序会在启动的时候执行一次 setlocale(LC_ALL, "C"),因此如果用户没有修改过系统语言的话,setlocale(LC_ALL, "") 也相当于什么都没做,只不过它会返回 "C" 而不是空指针。
由于多数人对于字符串的处理也就是普通的字符串把它当成 UTF-8 来用,需要对字符串进行进一步处理的用户肯定早就换上了宽字符串或者直接换一种语言(C/C++ 的字符串处理属实是灾难)。因此是否考虑修改通用模板,接收 setlocale(LC_ALL, "") 的返回值,判断是否是 UTF-8,如果不是就强制切换成 C.UTF-8,只不过由于返回值有好几种后缀,模板会略显复杂。Windows照旧。
—
Reply to this email directly, view it on GitHub, or unsubscribe.
You are receiving this because you commented.Message ID: ***@***.***>
|
但是 |
setlocale
的.utf-8
参数是 Windows 10 version 1803 (10.0.17134.0) 新加入的,不支持其他系统。这里提供一个godbolt 链接展示此问题。对于 Unix-like 系统,由于其默认使用 UTF-8 编码,因此提供一个空字符串接受本地 locale 即可达到本地化的效果。
Windows
.utf-8
参考链接