【问题标题】:Why does the Notepad++ [NULL] character not paste?为什么记事本++ [NULL] 字符不粘贴?
【发布时间】:2019-11-04 08:02:46
【问题描述】:

我是这个网站的新手,我不知道我是否提供了足够的信息 - 我会尽力而为 =)

如果你使用 Notepad++,那么你就会知道我在说什么 -- 当用户将 .exe 加载到 Notepad++ 中时,NUL / \x0 字符被替换为 NULL,它有一个黑色背景和白色文本。我尝试将其粘贴到 Visual Studio 中,希望获得相同的输出,但它只是粘贴了一些空格...

有谁知道这是某个组合键还是什么?我想将NULL 字符替换为\x0,就像记事本++ =)

【问题讨论】:

  • 改用十六进制编辑器。
  • 好吧,我正在创建一个Text Editor,我想知道如何用Notepad++ 使用的相同字符替换NUL 字节:)
  • 我不想使用hex 编辑器——我正在尝试创建自己的应用类型 =)
  • 我明白了。在下面阅读我的答案。看看有没有帮助。
  • 非常不建议在文本中放置 0x00 字节。它在任何编码系统中都不是有效字符,c/c++ 程序甚至会自动将其视为字符串的结尾。 极不建议在文本编辑器中打开 exe 文件。只需使用十六进制编辑器,sheesh。无论如何,你不能在那里做任何好事。

标签: c# visual-studio notepad++


【解决方案1】:

Notepad++ 可以使用自定义或特殊字体来显示这些特定字符。此行为也可能不适用于所有文本编辑器。所以,他们没有展示出来。
如果您想编写一个可视化这些字符的文本编辑器,您可能需要以编程方式实现此行为。如果需要,查看 notepad++ 源代码会有所帮助。

【讨论】:

  • 我查过了,但是它是用C++写的:(我不太懂C++..
  • 这不是一件容易的事。要做到这一点,你可能需要做大量的底层编程,甚至创建自定义文本框控件,这需要付出很大的努力!。
【解决方案2】:

Notepad++ 是一个富文本编辑器,不同于普通的记事本。它可以显示所有现代文本编辑器中常见的自定义图形。每当 notepad++ 遇到空字符的 ASCII 代码时读取文件时,它不会显示任何内容,而是将字符串“NULL”添加到 UI,将文本背景颜色设置为黑色,将文本颜色设置为白色,这就是您所看到的。您也可以在富文本编辑器中显示任何自定义样式。

注意:这绝不是一个有效的解决方案。我清楚地遍历读取字符串 2 次只是为了利用已经存在的方法。这可以通过一次手动完成。这只是为了提示您如何做到这一点。此外,我仔细编写了代码,但没有运行它,因为我目前没有工具。我为任何错误道歉,让我知道我会更新它

第 1 步:逐行读取文本文件(行以 '\n' 结尾)并使用 String.Replace() 用字符串 "NUL" 替换该行的所有空字符实例。最后将修改后的文本附加到您的RichTextBox

第 2 步:使用String.IndexOf() 查找每个“NUL”单词的起始索引,重新遍历您的读取行。使用这些索引,您可以从 RichTextBox 中选择文本,然后使用 RichTextBox.SelectionColorRichTextBox.SelectionBackColor 设置所选文本的样式

richTextBoxCursor基本上只是代表RichTextBox中每一行的起始索引

StreamReader sr = new StreamReader(@"c:\test.txt" , Encoding.UTF8); 
int richTextBoxCursor = 0;

while (!sr.EndOfStream){

   richTextBoxCursor = richTextBox.TextLength;

   string line = sr.ReadLine();
   line = line.Replace(Convert.ToChar(0x0).ToString(), "NUL");
   richTextBox.AppendText(line);

   i = 0;

   while(true){
     i = line.IndexOf("NUL", i) ;
     if(i == -1) break;

     // This specific select function select text start from a certain start index to certain specified character range passed as second parameter
     // i is the start index of each found "NUL" word in our read line
     // 3 is the character range because "NUL" word has three characters
     richTextBox.Select(richTextBoxCursor + i , 3);

     richTextBox.SelectionColor = Color.White;
     richTextBox.SelectionBackColor = Color.Black;

     i++;
   }

}

【讨论】:

  • 我该怎么做?
  • 这取决于您使用什么工具? WinForms、WPF 还是其他?
  • 我正在使用Windows Forms,我正在使用我的RichTextBox 进行编程,使用Visual Studio
  • 查看我编辑的答案。主要是使用RichTextBox.Select() 方法选择RichTextBox 中的每个“NUL”字,并使用RichTextBox.SelectionColorRichTextBox.SelectionBackColor 为其文本颜色和背景颜色着色
  • 您也可以点击这些链接,利用正则表达式让您的生活更轻松stackoverflow.com/questions/3707120/…codeproject.com/Articles/10675/…c-sharpcorner.com/article/…
【解决方案3】:

文本编辑器

据我所知,为了让 Visual Studio 显示不可打印的字符,您需要在 https://marketplace.visualstudio.com 上安装来自市场的扩展。

一个这样的扩展,我既没有尝试也没有推荐 - 我只是做了一个快速搜索,这是第一个结果 - 是 Invisible Character Visualizer.

话虽如此,复制粘贴二进制文件是一项有风险的业务。


您可以先尝试编辑>高级>查看空白


二进制编辑器

要真正了解发生了什么,您可以使用 VS 的二进制编辑器:File->Open->(Open with... option)->Binary Editor -> OK

【讨论】:

  • 那么,话虽如此,如果我只是将NUL 符号粘贴到 Visual Studio 中,即使字符串由空格组成,我仍然会在标签中获得相同的输出?我粘贴了NUL 字节,而我得到的是随机空格——这会影响什么吗?还是只会打印空格? :D
  • 我想说确定字符是否被保留的唯一方法是使用二进制编辑器。
【解决方案4】:

回答你的问题。

这是00H双字节的符号表示。

您正在复制和粘贴这些值。 Notepad++ 正在向您显示替换这些值表示的符号(因为您在该 IDE 中将其配置为这样做)。

【讨论】:

  • 但是,我怎样才能显示相同的符号?使用00Hbyte?
  • 关于你复制这个概念,必须研究notepad++在做什么——因为该功能不限于与样式相关的特定字体。 Glpyh 不太可能出现在页面其余部分使用的字体的字符映射中。
  • 嗯.. 我该怎么做?我在Github 上看到Notepad++,但我不知道那里发生了什么——我知道C# 很疯狂,但C++,一个谜..
  • 好吧.. 只需简要回顾一下代码,他们就有可能使用“音译”作为一种手段。 charMap 源和 charMap 目标。通常是语言的概念,但可以应用于此功能。
  • :) 我会在检查完Invisible Character See-er 或其他内容后进行调查:D
猜你喜欢
  • 2023-02-04
  • 1970-01-01
  • 1970-01-01
  • 2012-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-16
  • 1970-01-01
相关资源
最近更新 更多