Notepad-plus-plus: Notepad++ 7.7 以 ANSI 编码代替西里尔字符“????????”

创建于 2019-05-20  ·  86评论  ·  资料来源: notepad-plus-plus/notepad-plus-plus

Notepad++ v7.7(32 位)
搭建时间:2019年5月19日-13:08:20
路径:C:\Users\Uzeer\Downloads\npp.7.7.bin.minimalist\notepad++.exe
管理员模式:开启
本地会议模式:开
操作系统:Windows 7(64 位)
插件:无

Notepad++ v7.7(64 位)
构建时间:2019 年 5 月 19 日 - 13:05:35
路径:C:\Users\Uzeer\Downloads\npp.7.7.bin.minimalist.x64\notepad++.exe
管理员模式:开启
本地会议模式:开
操作系统:Windows 7(64 位)
插件:无

最有用的评论

@andrecool-68
给我写一封电子邮件,您可以在 bulgarian.xml 中找到它。 我当然可以在这里回答你,但这是一个 N++ 问题,不适用于其他程序:)

所有86条评论

确认

点击展开


屏幕旧了,但问题仍然存在

调试信息

Notepad++ v7.7(64 位)
构建时间:2019 年 5 月 19 日 - 13:05:35
路径:D:\Install\Office Programs\Notepad++\notepad++.exe
管理员模式:开启
本地会议模式:开
操作系统:Windows 7(64 位)
插件: AutoSave.dll ComparePlugin.dll ShtirlitzNppPlugin.dll TakeNotes.dll VisualStudioLineCopy.dll

@donho
我已经测试了所有版本的 SciTE,从 Scintilla 3.6.7 版本开始,开始出现西里尔文的问题。

Imgur

@rddim & @andrecool-68
那么你的操作系统的母语是什么?

有没有人可以在 Windows 10 下重现它?

@donho
我有 Win 7 x64 俄语版。

@donho

以防万一你看到和我一样的东西:
这将是 f。 如果可能的话,很难解决非俄罗斯本地人或保加利亚人的问题。

无论记事本 ++ 版本如何,我都无法在英语、西班牙语或德语 Windows 10 和 7 上将西里尔文文本插入 ansi 文件。
在 7.5.5 到 7.7 上测试和重新测试。
俄语文本到 utf-8 适用于所有版本。
(见下面的截屏)

7 6 6 cyrillic on ansi

你好。

@andrecool-68

我已经测试了所有版本的 SciTE,从 Scintilla 3.6.7 版本开始,开始出现西里尔文的问题。

所以 Scintilla 3.6.6 适合你吗?
在 ANSI 中键入 Cyrillic 在 3.6.7 及更高版本中被破坏,对吗?

@donho
没错,问题从3.6.7及更高版本开始!
视窗 7 x64

333

Windows 10 x64 (VirtualBox)

111

@donho
两台机器(办公笔记本电脑和家用电脑)都是Win7 Pro x64 SP1 英文版。 我无法在Win10上测试。
确认问题从SciTE v3.6.7 ,没有在SciTE v3.6.6

@donho
我不确定这是否会对您有所帮助,但是: https :

@donho
我尝试进行这些更改,然后出现了西里尔文。
文件:ScintillaWin.cxx
+ case SC_CHARSET_DEFAULT: return documentCodePage;
- case SC_CHARSET_DEFAULT: вернуть documentCodePage? documentCodePage: 1252;

但是每次尝试打印西里尔字符后,都会出现错误)))

Безымянный

@andrecool-68 很奇怪, case SC_CHARSET_DEFAULT: return documentCodePage;是 Scintilla 中 3.6.6 之前的旧代码(npp 在 7.7 之前使用)。

您可以在https://github.com/zufuliu/notepad2/releases测试或调试 Notepad2(在 GDI 和 D2D 模式下,设置 -> 渲染技术)
当调试断言失败时,选择中断,然后查看堆栈跟踪,看看它失败的地方。
通过堆栈跟踪,我们可能知道如何修复它。

@donho我可以确认该错误也在 Windows 10 x64 上表现出来。
@zufuliu我已经测试了你的 Notepad2 版本,文本在 D2D 和 GDI 模式下都能正确呈现。

image

编辑添加:
如果您从 NP++ 的编码菜单中手动选择 Windows-1251 代码页,文本将正确呈现。

@rddim你在打字前选择编码为 ANSI 吗? (通过菜单:File -> Encoding -> ANSI),因为默认的编码是UTF-8。 状态栏在 EOL 模式之前显示编码名称,如 CR+LF。

也尝试使用不同的方案。 方案 -> 文本文件,测试文本文件和第二个文本文件。 或启用(使用等宽字体,如 Consolas)和禁用(使用比例字体,如 Segoe UI)方案 -> 使用默认代码样式。

@zufuliu

在 Notepad2 中一切都按预期工作

notepad2_ansi_cyrillic

@rddim谢谢。

截图来自https://github.com/notepad-plus-plus/notepad-plus-plus/issues/5671#issuecomment -495190280 指向_chvalidator函数的指针。 从函数上方的注释中,一些 ctype 函数被调用时使用了超出范围的字符。
未知调用在哪里,Scintilla 它不直接调用 ctype 函数(词法分析器除外)。

@andrecool-68 可以在 VS 下运行你的 NPP 调试版本(点击本地 Windows 调试器),并在断言失败时截取调用堆栈的截图?

好的,我发现此代码(已报告为问题 #5280)在键入非 ASCII 字符(ANSI 和 UTF-8 代码页)时导致断言失败。

static bool isAllDigits(const generic_string &str)
{
    return std::all_of(str.begin(), str.end(), ::isdigit);
}

@zufuliu

好的,我发现此代码(已报告为问题 #5280)在键入非 ASCII 字符(ANSI 和 UTF-8 代码页)时导致断言失败。

它被Notepad++的自动完成使用,但与俄语输入失败无关。
知道问题的根源吗?

@andrecool-68 @rddim
您可以禁用自动完成功能然后再试一次吗?

@donho

相同的结果 - кирилица (utf-8) => ???????? (ansi)

我认为主要原因是 Scintilla 的 CodePageFromCharSet 的变化:

-   case SC_CHARSET_DEFAULT: return documentCodePage;
+   case SC_CHARSET_DEFAULT: return documentCodePage ? documentCodePage : 1252;

由于使用了 SC_CHARSET_DEFAULT,所以使用 1252 而不是 1251 来转换输入的西里尔字符,映射为垃圾。

从关于错误https://sourceforge.net/p/scintilla/bugs/2093/#3ee4 的讨论,
在这种情况下,建议将字体字符集设置为 SC_CHARSET_RUSSIAN。
但是根据我的经验,设置语言环境依赖的字符集需要实际使用的字体支持字符集。
https://sourceforge.net/p/scintilla/bugs/2093/#263b/5bac/7f06

恢复到case SC_CHARSET_DEFAULT: return documentCodePage可能是最简单的修复,因为我们知道我们设置为 Scintilla 的代码页只有 UTF-8、DBCS ANSI 代码页(932、949、950 和 1361)和 SBCS ANSI 代码页( 0,CP_ACP)。

@donho我建议升级到 4.1.5,因为绑定 DBCS https://sourceforge.net/p/scintilla/bugs/2093的错误

@donho
@zufuliu

我编译了原始的 Scintilla 4.1.5,将 SciLexer.dll 复制到 Notepad ++ 目录。 结果没有改变,而是西里尔字母“?????”

000

@andrecool-68 更改了 Scintilla 的 CodePageFromCharSet(在 ScintillaWin.cxx 中)?

+   case SC_CHARSET_DEFAULT: return documentCodePage;
-   case SC_CHARSET_DEFAULT: return documentCodePage ? documentCodePage : 1252;

断言失败是因为自动完成,您可以在测试前禁用自动完成。

@zufuliu我没有改变任何东西......从官方网站下载的原始 Scintilla

@andrecool-68 请尝试将 CodePageFromCharSet 更改为case SC_CHARSET_DEFAULT: return documentCodePage;

或将第一行添加到void ScintillaEditView::defineDocType(LangType typeDoc) (PowerEditor\src\ScitillaComponent\ScintillaEditView.cpp 中的第 1315 行)

    execute(SCI_STYLESETCHARACTERSET, STYLE_DEFAULT, SC_CHARSET_RUSSIAN);
    execute(SCI_STYLECLEARALL);

@donho
@zufuliu

@andrecool-68 更改了 Scintilla 的 CodePageFromCharSet(在 ScintillaWin.cxx 中)?

+   case SC_CHARSET_DEFAULT: return documentCodePage;
-   case SC_CHARSET_DEFAULT: return documentCodePage ? documentCodePage : 1252;

断言失败是因为自动完成,您可以在测试前禁用自动完成。

在调试构建记事本++中它起作用了!

@andrecool-68 请尝试将 CodePageFromCharSet 更改为case SC_CHARSET_DEFAULT: return documentCodePage;

或将第一行添加到void ScintillaEditView::defineDocType(LangType typeDoc) (PowerEditor\src\ScitillaComponent\ScintillaEditView.cpp 中的第 1315 行)

    execute(SCI_STYLESETCHARACTERSET, STYLE_DEFAULT, SC_CHARSET_RUSSIAN);
    execute(SCI_STYLECLEARALL);

这两个选项都有效!
但我认为最好在文件 ScintillaWin.cxx 中进行更正?!
因为不知道第二个选项将如何影响其他语言。

111

我无法测试发布版本......不签署证书就行不通,我不知道如何签署证书)))

https://github.com/notepad-plus-plus/notepad-plus-plus/issues/5671#issuecomment -496003800 中查看我的评论

我更喜欢更改 Scintilla 的 CodePageFromCharSet。

@andrecool-68 @rddim
你能试试新编译的 Scilexer.dll (没有 boost 的 PCRE) 吗?
https://notepad-plus-plus.org/temp/

@zufuliu

见我在#5671(评论)中的评论

我更喜欢更改 Scintilla 的 CodePageFromCharSet。

我在之前的评论中说过同样的话))

@zufuliu谢谢你的信息。
您能否在 Notepad++ 7.7 中重现该错误(已在 Scintilla 4.1.5 中修复)?
如果可以的话,你能提供重现它的方法吗?

@donho

@andrecool-68 @rddim
你能试试新编译的 Scilexer.dll (没有 boost 的 PCRE) 吗?
https://notepad-plus-plus.org/temp/

使用此文件,Notepad ++ 根本无法启动,它给出错误“未找到 SciLexer.dll”

@donho这在 4.1.5 中没有修复,行case SC_CHARSET_DEFAULT: return documentCodePage ? documentCodePage : 1252;自 2016 年以来没有改变。

Scintilla 4.1.5 修复了在 DBSC 代码页中键入 DBSC 字符的错误。

@donho
我只更改了一行

namespace Scintilla {

UINT CodePageFromCharSet(DWORD characterSet, UINT documentCodePage) {
    if (documentCodePage == SC_CP_UTF8) {
        return SC_CP_UTF8;
    }
    switch (characterSet) {
    case SC_CHARSET_ANSI: return 1252;
    case SC_CHARSET_DEFAULT: return documentCodePage;
    // case SC_CHARSET_DEFAULT: return documentCodePage ? documentCodePage : 1252;

C:\Users\Uzzer\Downloads\notepad-plus-plus-master\scintilla\win32\ScintillaWin.cxx
不依赖于版本是 4.1.4 还是 4.1.5

在调试版本中使用我的文件 Scilexer.dll,只有在禁用自动完成时,一切才对我有用

@zufuliu

Scintilla 4.1.5 修复了在 DBSC 代码页中键入 DBSC 字符的错误。

我在Windows 7中文版下测试了Notepad++ 7.7。
ANSI 模式下的中文输入工作在 v7.7。
所以对我来说没有 DBSC 问题——至少对中国人来说是这样。
你有什么稳定的方法在 Notepad++ v7.7 中产生 DBSC 问题吗?

@donho

编辑:我在网站上没有找到任何其他调试版本的 N++

@donhohttps://sourceforge.net/p/scintilla/bugs/2093/查看错误报告
它可以用 NPP 7.7 二进制文件复制。

@donho https://sourceforge.net/p/scintilla/bugs/2093/ 上的错误(打字 DBCS)和 https://sourceforge.net/p/scintilla/bugs/2038/ 上的另一个错误(内联 IME)(不固定)会影响自动完成。
我认为 NPP 可以简单地忽略 DBCS 代码页中的任何 ch > 0x7F 或者当从 IME 输入 ch 时,CJK 单词的自动完成是卑鄙的。

@andrecool-68 @rddim
请尝试此 x64 版本。 仅适用于 Notepad++ 调试模式,因为它没有签名。

@donho

这次再次尝试使用https://notepad-plus-plus.org/pluginListTestTools/notepad++.debug.x86.zipSciLexer.32.dll给我与https://github.com/notepad-plus-相同的结果

我不知道如何在调试模式下运行 N++。 如果您的意思是来自 VS,那么我没有 VS。

@donho
Безымянный

2

@andrecool-68 @rddim
谢谢你的测试。 似乎这不是@zufuliu建议的解决方案:

+   case SC_CHARSET_DEFAULT: return documentCodePage;
-   case SC_CHARSET_DEFAULT: return documentCodePage ? documentCodePage : 1252;

这也很有趣,它在调试模式下工作(https://github.com/notepad-plus-plus/notepad-plus-plus/issues/5671#issuecomment-496128852)但不是发布模式?

至少 Notaped2 使用更改https://github.com/zufuliu/notepad2/blob/master/scintilla/win32/ScintillaWin.cxx#L1292

@andrecool-68 execute(SCI_STYLECLEARALL);第一行可以省略。

@zufuliu
我没有注意到线路的重复......需要抽烟)))

@donho

在使用notepad++.debug.x86.zipSciLexer.32.dll禁用的Auto-Completion抽烟后,一切都按预期工作。 启用Auto-Completion它给了我前面提到的错误

@donho如何关闭“闪烁”证书验证?
...以便可以测试发布版本
我不会分发这些版本,我只会测试它们。

在使用 notepad++.debug.x86.zip、SciLexer.32.dll 和禁用的自动完成后,一切都按预期工作。 启用自动完成后,它会给我前面提到的错误

所以吸烟对健康有害,但对程序测试有益? :D

如何关闭“闪烁”证书验证?

你不能。 我将为你们提供 32 和 64 签名的发行版二进制文件,以确保一切正常。

@zufuliu所以你的解决方案有效。 谢谢你。 但是,这种修改会产生任何副作用吗?

@donho Truth 在任何争议中诞生
感谢大家和我的狗
只有她可以搬运我的电脑

@zufuliu感谢您的帮助
您的编辑器支持本地化吗?

Woohoo 它还活着 :D 现在大约有 2.75 亿人可以在 ANSI 中输入西里尔文
非常感谢@andrecool-68 @rddim @donho @MetaChuh @zufuliu

npp_ansi_solved

对我来说完全没有关系……但是我的朋友需要1255和1251。

@andrecool-68
大声笑......在我们今天阅读后,最好在您发布的图片上放一个黑色审查栏,以确保我们不会冒犯任何人😂

@rddim
我是坏警察,所以不需要感谢我。
尽管较新的闪烁版本是原因,但在您的所有集体帮助下解决这个问题是唐的私人倡议。

此致。

@MetaChuh
我的狗对摩托车司机很宽容))

@MetaChuh
你很狡猾……你有犹太人的东西
打架结束后……男孩骑着摩托车来了……这不公平
当我想转动我的狗的尾巴时......我不会向任何人寻求帮助
但是如果notepad++有问题,我想解决这个问题。

@zufuliu感谢您的帮助
您的编辑器支持本地化吗?

抱歉,没有关于 i18n 的计划。

在使用 notepad++.debug.x86.zip、SciLexer.32.dll 和禁用的自动完成后,一切都按预期工作。 启用自动完成后,它会给我前面提到的错误

所以吸烟对健康有害,但对程序测试有益? :D

如何关闭“闪烁”证书验证?

你不能。 我将为你们提供 32 和 64 签名的发行版二进制文件,以确保一切正常。

@zufuliu所以你的解决方案有效。 谢谢你。 但是,这种修改会产生任何副作用吗?

什么解决办法? 更改 Scintilla 的 CodePageFromCharSet 还是使用 SCI_STYLESETCHARACTERSET? 前者返回ACP(0),应该有副作用,后者有,见https://github.com/notepad-plus-plus/notepad-plus-plus/issues/5671#issuecomment -496003800。

我在 Notepad++ 7.7 32 位捷克语 (windows-1250) 上遇到了类似问题。
我无法在 ANSI 编码中输入或粘贴一些捷克字母。

用提供的 (SciLexer32.signed.dll 27-May-2019 22:00) 替换 SciLexer.dll 有帮助,问题消失了。

将是 npp 的更新?

@lehha

将是 npp 的更新?

不,它不会——至少现在还没有。 正如@zufuliu 所提到的,这不是一个完整的解决方案,它会产生副作用

@andrecool-68 & @rddim
所以新的 Scilexer.dll 对你有用,但你必须禁用自动完成,对吗?
如果启用自动完成会发生什么?

SciLexer.32.dll 和禁用的自动完成一切都按预期工作。 启用自动完成后,它会给我前面提到的错误

什么是“先前提到的错误”? 你能帮我说得更清楚吗?

@donho
~我没有看到西里尔文有任何错误。~
启用自动完成。
https://notepad-plus-plus.org/temp/cyrillacPb/

000

抱歉,有错误。 更新窗口后,记事本++消失了第一个字符,编码也发生了变化。
Безымянный

这是另一个错误,更改字符,更改字符大小写,更改编码。
111

谢谢! 我看不到上面的直接链接,所以有:

https://notepad-plus-plus.org/temp/cyrillacPb/SciLexer32.signed.dll
或者
https://notepad-plus-plus.org/temp/cyrillacPb/SciLexer64.signed.dll

必须替换 C:\Program Files (x86)\Notepad++ 中的 SciLexer.dll

@donho

使用来自https://notepad-plus-plus.org/temp/cyrillacPb/的 SciLexers,它可以与启用的自动完成一起使用,即没有问题。 它不适用于此评论的组合https://github.com/notepad-plus-plus/notepad-plus-plus/issues/5671#issuecomment -496189871 这也是"previously mentioned error"的答案

@rddim所以对于你来说,来自https://notepad-plus-plus.org/temp/cyrillacPb/ 的SciLexers 已经解决了这个问题,没有任何副作用?

@donho我再次测试以确保:

  • x64 SciLexer 工作完美 - 目前没有问题,西里尔文工作和自动完成工作在 ANSI
    npp_x64_auto-compl
  • x32 SciLexer - 我可以输入西里尔字母,但自动完成不起作用,它适用于拉丁字符
    npp_x32_no_auto-compl

@rddim重启你的记事本++并重新打开这个文件......你看到了什么?

@andrecool-68 x32 和 x64 都在重新打开后可读

npp_reopen

@rddim Autodetect character encoding启用了吗?

@andrecool-68 是的,默认设置,这就是为什么它是Windows-1251而不是ANSI

@rddim而且我什么都不懂)))

Imgur

@andrecool-68 @donho
在 x32 中,当单词以小写字母Auto-Completion开头时不起作用,但并非总是如此( new 3 )。 我认为其他问题与Autodetect character encoding

npp_x32_cyr1

编辑: Auto-Completion存在于7.6.6 x32

@rddim第四个标签是获得希伯来语))
你用什么插件插入完成的文本?

@ andrecool-68 外部剪贴板管理器 - CLCL

@rddim
如何禁用这些行,我在设置中找不到它

Imgur

@andrecool-68
给我写一封电子邮件,您可以在 bulgarian.xml 中找到它。 我当然可以在这里回答你,但这是一个 N++ 问题,不适用于其他程序:)

有人也可以帮我吗?
我觉得我的问题很相似,
我在 npp 社区(在 7.7 版本的线程中)发帖,但我无法获得我请求的支持,我一直不知道为什么..

反正,
我在这里重新发布:

我通过使用 npp 打开的电子邮件收到 sql 查询
然后我将文件内容复制到 sql manager 程序以执行它们,
好吧,7.7 希腊字符显示为中文,我回滚到 7.6.6 并正常显示

我禁用了“自动检测字符编码”,
在我过去遇到的另一个问题之后,
所以我宁愿它保持关闭

编辑:我尝试了上面的 scilexer(32 位):
https://notepad-plus-plus.org/temp/cyrillacPb/SciLexer32.signed.dll
它也对我有用!

@patrickdrd @rddim @andrecool-68
你们能否测试以下二进制文件并确认我的错误已修复并且没有回归(启用自动完成功能)?
32 位:
https://notepad-plus-plus.org/temp/cyrillacPb/npp.7.7.bin.zip
64 位:
https://notepad-plus-plus.org/temp/cyrillacPb/npp.7.7.bin.x64.zip

我刚刚测试了 32 位,看起来不错,
即使我需要几个小时才能测试相同的场景

好的,原始场景也适用

@donho
输入西里尔字母时没有问题。
当您重新打开文件 (ANSI) 时,初始字符消失。
(ANSI 变成 Macintosh)
最有可能归咎于“自动检测字符编码”
Autodetect character encodingauto-completion ...启用)

000

@andrecool-68 在测试我提供的两个二进制文件后,我需要您的确认,以解决 ANSI 模式输入问题。 我看到你的帖子,这个问题是另一个问题。 让我们一个接一个地解决问题,否则你只是把大家弄糊涂了,一点帮助也没有!

@donho也许我的话你不明白......对不起,但我是通过 translate.google 写的))
我想说我测试了这两个文件,并且西里尔字母被打印出来没有错误。
而事实是重新打开文件时的工件......我自己也不知道......这是旧错误或新错误的延续。
我在测试时注意到的......然后我通知你

@donho
我用“scintilla416”(具有相同的更改)编译了调试版本记事本++,

// case SC_CHARSET_DEFAULT: return documentCodePage ? documentCodePage : 1252;
case SC_CHARSET_DEFAULT: return documentCodePage;

编码的自动定义被禁用……那么西里尔文就没有问题了。

如果启用了“自动编码检测”,那么与我在上一篇文章中所写的编码完全相同的工件。
Безымянный

也许这会以某种方式帮助你。

如果启用了“自动编码检测”,那么与我在上一篇文章中所写的编码完全相同的工件。

所以这是“自动编码检测”的问题。 请为此创建一个新问题。

@donho抱歉回复晚了,我很忙而且不在家。
修复工作完美。 谢谢

恐怕这个问题仍然存在,伙计们,
带有希腊字符的文本文档无法在我的 Windows 7 32 位桌面上正确显示,
虽然它在 Windows 8 64 位上显示良好,但如果使用其他编辑器也是如此

编辑:也许这是一个不同的问题,因为我回滚到 7.6.6 并且它仍然存在,
我什至尝试在 npp 中用希腊语写,但似乎不可能!
我可以在记事本(windows)中输入希腊语,但似乎我不能在npp中输入

此页面是否有帮助?
0 / 5 - 0 等级