zufuliu / notepad4

Notepad4 (Notepad2⨯2, Notepad2++) is a light-weight Scintilla based text editor for Windows with syntax highlighting, code folding, auto-completion and API list for many programming languages and documents, bundled with file browser plugin matepath.
Other
3.29k stars 211 forks source link

bat 格式乱码 第三次反馈了 #447

Closed Davider-code closed 2 years ago

Davider-code commented 2 years ago

第三次反馈乱码问题了, 目前用的是最版本的r4056

ctrl+shift+a乱码问题,自上次反馈后, 一直没有解决, 那我就手动使用右下角的编码窗口改吧, 但是即使是手改, 也会乱码, 也会自动将GBK转为UTF8, 批处理用utf8没法执行,

在日常实际使用过程中, 乱码的问题, 要严重的多了, 大多指的是编辑CMD和PS脚本相关的代码,

比较喜欢notepad2的自动输入功能, 所以在反馈一次, 说实话, 用别的记事本软件, 从来没有遇到乱码过, 期待开发者能加把劲, 把乱码问题彻底解决一下, 提前感谢

刚刚看了一下其它反馈的问题, 还真发现乱码的问题, 不少, 看来是共性了

测试文件: https://send.cm/d/9PzD 操作演示 abc

zufuliu commented 2 years ago

The batch file doesn't run. Both file looks correct to me with default settings, 要拷到的文件.txt is UTF-8 not ANSI.

zufuliu commented 2 years ago

This might due to the encoding declaration <?xml version="1.0" encoding="UTF-8"?>. check "Don't parse encoding tags." or reload without file variables (File -> Reload -> No File Variables) should fix problem for the specific file. Maybe it's better to validate the encoding declaration for small file, and show warning when validating failed.

encoding

Davider-code commented 2 years ago

感谢回复, 不能智能化一点, 免手改吗? 另外改了设置后, 会不会对代码执行有影响? 

另外, 为什么一个ANSI的文件, 我手改格式为UTF8-BOM, 但是打开后还是ANSI? 怎样解决这个问题?

Ctrl+shift+A 会使文章乱码, 右下角手动改成ANSI不乱码, 这个要设置哪里? 上次反馈后, 一直没解决

最后, 反馈乱码问题这么多, 感觉是不是应该想想更彻底的解决方案, 我用国外的emeditor, 从来没遇到乱码问题

Davider-code commented 2 years ago

建议能以目标为导向, 把一些通用的, 眼见为实的设置设为默认.

大家用记事本, 可能就是改改文字,改编码, 批处理, 命令之类的简单操作,  虽然每次反馈, 都能给个解决方案, 但是感觉太复杂了, 有些选项应该根据大众的使用频率设为默认

记的第一次下载使用notepad2, 还没操作几下就乱码了, 但是发现输入时, 能自动提示,软件, 补全, 着色, 又硬着头皮一路用下来了, 但乱码问题实在太多, 有些应该不是BUG, 可能是我太笨了, 但至少希望开发者能考虑一下上面的建议

Davider-code commented 2 years ago

再例如, 我新建了一个空的txt文件, 然后,在任务栏右下角改编码格式为UTF8-BOM, 然后关闭文件再打开, 文件的格式还是UTF8, 为什么更改没有生效? 这样设计有什么意义?

我用的有个软件, 如果文件格式为UTF8的话就会乱码, 必须UTF8-BOM , 现在搞的我, 必须用那个软件来生成空的UTF8-BOM, 不然用notepad2生成的,直接乱码, 后面怎么改都不行

Davider-code commented 2 years ago

@zufuliu 我把有abc三个字母的txt文件, 改成ansi都不灵, 始终都是utf8, 真是晕菜了, 难道还要设置某些参数? 为啥这么难搞? 请看图: abc

lifenjoiner commented 2 years ago

鉴于你的习惯,试试: Based on your habit, try: default-encoding

Davider-code commented 2 years ago

@zufuliu 你好, 现在我下载使用了r4130, 乱码有所好转, 情况如下

我新建一个bat后缀的文件, 打开后,自动就是ANSI编码格式, 这点不错, 因为批处理要这个格式才能正确执行, 以前是UTF8

基于此, 我想问一下, 能否实现我新建一个.ps1后缀的文件【powershell脚本文件】, 打开后, 自动就是UTF8-bom编码格式?

因为powershell脚本文件默认的编码就是UTF8-bom, 我如果用UTF8, 用某款软件打开中文部分是乱码, 如果不能实现, 有没有手动设置的地方? 提前感谢

Davider-code commented 2 years ago

@lifenjoiner 感谢提醒,对于bat文件 r4130默认就是ansi了

Davider-code commented 2 years ago

@zufuliu 刚发现的问题, 如果我新建一个txt文件,默认是utf8格式,我打开后,我从状态栏右下角把编码改成utf8-bom,却无法点击保存了, 按钮变灰了,转格式也不行了? 转换文本编码格式实在是高频常用, 对于字幕, 对于批处理, 对于PS脚本 . . . 用系统自带的记事本都可以用另存的方式改成其它的编码,真心希望下个版本彻底解决一下这些问题, 我在群里, 贴吧, 论坛, 看到太多notepad2 乱码的问题 要求很简单, 1.能使用状态栏右下角把编码改为任意编码格式 2.对于各类型或扩展名文件可以自定义编码或加载格式,例如 .bat默认是ansi .srt默认是utf8 .ps1默认是utf8-bom 3.对于直接右键新建的txt文件, 如果直接更改扩展名,打开后,直接按上面第二条推荐的编码加载,现在新建的.txt改后缀.bat打开后就是ansi不错,其它建议也这样

Mapaler commented 2 years ago

你在bat第一行加上chcp 65001就可以写 UTF-8 的 bat 了

Davider-code commented 2 years ago

你好, 我测试了一下, 无法执行

Mapaler commented 2 years ago

你好, 我测试了一下, 无法执行

chcp 65001放在第一行。 文件要需要存成UTF-8 no BOM才行。 bat是强制以ANSI形式打开的,chcp 65001是切换到UTF-8代码页的命令,而UTF-8 no BOM的ASCII字符部分兼容ANSI,所以可以实现utf-8来书写后续的代码。

Davider-code commented 2 years ago

你好, 我测试了一下, 无法执行

chcp 65001放在第一行。 文件要需要存成UTF-8 no BOM才行。 bat是强制以ANSI形式打开的,chcp 65001是切换到UTF-8代码页的命令,而UTF-8 no BOM的ASCII字符部分兼容ANSI,所以可以实现utf-8来书写后续的代码。

感谢指教 我是在.bat后缀的批处理里面执行powershell代码, 就像最上面的演示那样 尝试了多次你提醒的方式, 行不通, 因为 powershell代码中, 用到了不少编码格式的函数

Mapaler commented 2 years ago

你好, 我测试了一下, 无法执行

chcp 65001放在第一行。 文件要需要存成UTF-8 no BOM才行。 bat是强制以ANSI形式打开的,chcp 65001是切换到UTF-8代码页的命令,而UTF-8 no BOM的ASCII字符部分兼容ANSI,所以可以实现utf-8来书写后续的代码。

感谢指教 我是在.bat后缀的批处理里面执行powershell代码, 就像最上面的演示那样 尝试了多次你提醒的方式, 行不通, 因为 powershell代码中, 用到了不少编码格式的函数

powershell不应该直接用ps1文件吗?本身就支持utf-8。 bat里面可以用powershell来调用ps1文件啊。

Davider-code commented 2 years ago

@Mapaler .bat文件的第一行,加下面的代码, 其它行是Poweshell代码, 这样方便

@&cls&powershell "gc '%~0'|out-string|iex"&pause&&exit

Davider-code commented 2 years ago

@zufuliu 刚刚又遇到问题了, 一个包含中文的GBK编码的txt文件, 用notepad2状态栏右下角改编码格式为UTF-16LE, 保存后再打开, 所有文字全部乱码, 右下角仍显示GBK, 怎么都不能恢复了, 这太恐怖了, 建议加急处理一下, 如果被人不小心用了, 那郁闷死了 我对编码不太懂, 感觉utf-16应该可以兼容gbk里的字符范围吧, 表达若有误, 欢迎指出

zufuliu commented 2 years ago

@zufuliu 刚刚又遇到问题了, 一个包含中文的GBK编码的txt文件, 用notepad2状态栏右下角改编码格式为UTF-16LE, 保存后再打开, 所有文字全部乱码, 右下角仍显示GBK, 怎么都不能恢复了, 这太恐怖了, 建议加急处理一下, 如果被人不小心用了, 那郁闷死了 我对编码不太懂, 感觉utf-16应该可以兼容gbk里的字符范围吧, 表达若有误, 欢迎指出

Please attach zipped test file.

Davider-code commented 2 years ago

@zufuliu 刚刚又遇到问题了, 一个包含中文的GBK编码的txt文件, 用notepad2状态栏右下角改编码格式为UTF-16LE, 保存后再打开, 所有文字全部乱码, 右下角仍显示GBK, 怎么都不能恢复了, 这太恐怖了, 建议加急处理一下, 如果被人不小心用了, 那郁闷死了 我对编码不太懂, 感觉utf-16应该可以兼容gbk里的字符范围吧, 表达若有误, 欢迎指出

Please attach zipped test file. Test.zip

Davider-code commented 2 years ago

@zufuliu 这两天使用r4130, 除了bat默认ansi有改观以外, 其它的问题,仍然都存在, 转编码没生效, 转编码出乱码, 太严重了 暂时先用powershell ISE编辑了, 过一段时间再下载notepad2新版尝试

Davider-code commented 2 years ago

为什么用下面的代码检测notepad2生成的utf-8-bom, 怎么测都是truehttps://www.programminghunter.com/article/8483784766/

zufuliu commented 2 years ago

This should fixed now, please test latest builds.

Davider-code commented 2 years ago

多谢提醒, 请问在哪里下载, 我看发布页还是4130

zufuliu commented 2 years ago

Latest development builds (artifacts in Release configuration for each compiler and platform) are available at https://github.com/zufuliu/notepad2/actions and https://ci.appveyor.com/project/zufuliu/notepad2.

e.g. artifacts for latest build https://github.com/zufuliu/notepad2/actions/runs/2077973365 https://ci.appveyor.com/project/zufuliu/notepad2/builds/43100879/job/8180f6phk4fx2q7p/artifacts

Davider-code commented 2 years ago

你好, 刚试了一下, Notepad2 (64-bit) 4.22.03 r4130 (89af6d4d) 感觉还是老样子,描述如下 1.我新建了一个空的txt, 然后打开, 然后利用状态栏改编码为utf8-bom , 然后保存按钮是灰色, 不能保存, 只有输入字符才可以保存, 以前的版本是可以保存的, 但是保存后不能生效 2.还是上面的空文件, 我输入a, 然后改编码为ansi 保存, 再次打开, 编码显示仍然是utf8 , 编码没有修改成功, 但是如果我改编码为utf8-bom保存, 再打开是编码修改成功的 别的还没有试, 有点试怕了, 改编码这么难吗? 目前正在使用Powershell脚本改编码

zufuliu commented 2 years ago

Issue 1 is fixed by a4923681ea095ba94a536a80eaf686eb57ae3c48. Issue 2 is intended: if don't want UTF-8, you can (1) uncheck "Open 7-bit ASCII file in UTF-8 mode" and set default encoding to non-UTF-8 encoding; (2) type some non-ASCII characters, e.g. Chinese characters.

Davider-code commented 2 years ago

感谢及时回复,  关于问题2, 我还是不明白, 难道不能按照文本本身的编码格式来加载吗?   说简单一点, 就是让我所改,所见即所得: 1.当我把编码改成了ansi 如果是英文, 当我再次打开文件时右下角显示 ansi 如果是中文, 右下角显示GBK 2.当我把编码改成了utf8 当我再次打开文件时右下角显示 utf8 3.当我把编码改成了utf8-bom 当我再次打开文件时右下角显示 utf8-bom 逻辑本来不就这样吗? 在下不才, 只会点CMD和PS脚本, 真不明白一个简单的记事本, 搞这么多花样, 实在是晕菜了

lifenjoiner commented 2 years ago

不妨趁机多了解一下编码,编码有差异性,也有一定的兼容性。特别是纯英文字符(ASCII)的 ANSI 编码,是一些其它编码的子集,比如:GBK、UTF8等。

Mapaler commented 2 years ago

字符与二进制序列的对应关系,叫做字符集。 ASCII 字符集由 美国电气和电子工程师协会于1963年推出。使用7位表示 数字、英语字母、常用英文符号 等128种字符。 每个字符对应的序号叫做码点。 将码点储存到硬盘上时记为一个或多个字节,这种映射叫做编码。ASCII 采用 7位前面补 0 形成 8 位刚好一个字节的形式来编码。

美国制定的 ASCII 字符集不足以显示其他地区的文字,因此不同国家和地区分别制定了自己的字符集标准。不同地区的字符集是各自定义的,因此互相不兼容。 GB、Big5、日本的 Shift JIS 等为了使 英文文件 直接打开不会乱码,前 128 位码点字符都和 ASCII 一致,以 1 个字节储存;汉字码点大于255,以2个字节的形式储存。但互相之间打开,码点128以后的字符会变为乱码。 这类兼容 ASCII 但互相之间并不兼容的字符集,在 Windows 下被称为 ANSI 代码页,代表当前系统默认语言的字符集,所以简体中文电脑 ANSI 指的就是 GBK,繁体中文就是 Big5,日文下则是 Shift-JS。

不同 地区编码 阻碍了信息的沟通,来自多个国家政府和各大软件商的代表参与建立了非营利机构Unicode联盟,负责制定Unicode标准。 Unicode定义了十几万个字符,以及未来的扩展区,因此码点长度需要32位。 因此如果采用UTF-32方式编码,储存形式虽然Unicode码点完全一致,但每个字符要使用4个字节,容量太大,现实中根本没人使用。 大部分情况下,人们不会用到码点为6万以后的字符,因此UTF-16以2个字节表示的形式基本也和Unicode原始码点一致,以至于以前的记事本直接将UTF-16小端序称作Unicode。 但是UTF-16 对于日常只有英文字符的西方人仍然增加了储存所需要的空间,并且 2 字节也不兼容 ASCII 编码。 所以现在主流使用的是UTF-8编码,前128位兼容 ASCII,英文字符只占一个字节,到后面增加长度来表示其他字符,因此UTF-8编码的文件中,常见的中文字符占用3个字节。 但不管什么编码,读取到内存中时,系统都会将其还原成Unicode的码点。

字节顺序标记(英语:byte-order mark,BOM)用来标记文件使用的是哪一种Unicode字符编码。 在没有 BOM 且只有英文字符时,UTF-8 和 ASCII 编码完全一致,程序并不能判断你是 UTF-8 还是某一种 ANSI 编码,有汉字时则可以进行猜测。

Davider-code commented 2 years ago

非常感谢您的分享, 大概了解了原理 我只是感觉使用软件设置编码后, 输出的结果应该能所见即所得, 越简单越通用越好,  如果真是技术上难以判断, 那我也不纠结这个问题了, 我目前用下面的方法创建自己想要的编码的文件的, 

用下面的PS代码, 可以可以分别输出 GBK和UTF8-bom的 纯英文内容的bat文件 "abc" | Out-File -enc default "$HOME\Desktop\test.bat" "abc" | Out-File -enc utf8 "$HOME\Desktop\test.bat"

另外一些其它文本编辑软件是能实现我的需求的

Mapaler commented 2 years ago

直接看文件二进制,可以发现GBK、Big5、UTF-8的英文字母和常见控制符换行回车编码完全一样。所以不打后面的中文二字时,记事本不知道你是GBK还是UTF-8。 那么就在UTF-8前面加入BOM(第四个文件),就是明确的告诉记事本这是UTF-8。 1650252224708_explorer

至于你说只有英文的 bat 打开是 gbk,是因为作者之前的设定,强制 bat 以 ANSI 打开,你把扩展名改成 txt ,你打开就变成 utf-8 了。