如何在JavaScript中使用支持Unicode的正则表达式?例如,应该有类似于\ w的东西可以匹配字母或标记类别中的任何代码点(不仅仅是ASCII代码),并且希望像[[P*]]这样的过滤器用于标点符号等.
我想我需要删除0-31和127的字符,
是否有一个函数或一段代码来有效地执行此操作.
有标准的AZ,az字符,但也有连字符,em破折号,引号等.
此外,还有所有的国际角色,如变形金刚等.
那么,对于基于英语的系统,完整的设置是什么?那些其他语言的集合呢?UTF8,UTF16等怎么样?
奖金问题:需要多少名称字段,以及它们的最大长度是多少?
编辑:人名中肯定有两种不同类型的字符,那些作为上下文的一部分,以及那些由于结构原因而存在的字符.我不想限制或干扰上下文字符,但我确实需要处理结构上的字符.
例如,我有一个名字,它被一个em破折号分开,但是很难将它与减号区分开来.为了使系统更容易搜索,我想采用所有五种不同类型的破折号,并将它们映射到一个唯一字符(减号),这样搜索者就不需要具体知道最初输入的符号.
破折号也存在问题,可能还有引号,还有多少其他符号?
我只是想知道.NET 2.0中是否有一种方法可以检查字符是否可打印 - 类似于isprint(int)标准C.
我找到了Char.IsControl(Char).
这可以用于此目的吗?
为什么下面的代码Grammar无法解析unicode字符?
从中删除单词边界后解析很好<sym>。
#!/usr/bin/env perl6
grammar G {
proto rule TOP { * }
rule TOP:sym<y> { «<.sym>» }
rule TOP:sym<?> { «<.sym>» }
}
say G.parse('y'); # ?y?
say G.parse('?'); # Nil
Run Code Online (Sandbox Code Playgroud) 如何在多语言输入中删除不可打印的 unicode 字符?
当使用不同本地化的用户粘贴字符串时,他们有时会无意中嵌入非打印字符。例如:
var weird = "%E2%80%AA%E2%80%8ETest%E2%80%AC"
var displaysAs = decodeURI(weird); // Users see only "Test"
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚如何以不影响其他语言的方式剥离非打印字符:
encodeURI("???") = "%D8%B4%D9%86%D8%B7"
encodeURI("????") = "%E6%88%A6%E8%89%A6%E5%B8%9D%E5%9B%BD"
Run Code Online (Sandbox Code Playgroud)
例如,以下尝试修复上面奇怪的示例不起作用:
var weird = "%E2%80%AA%E2%80%8ETest%E2%80%AC"
var displaysAs = decodeURI(weird); // Users see only "Test"
Run Code Online (Sandbox Code Playgroud)
encodeURI("???") = "%D8%B4%D9%86%D8%B7"
encodeURI("????") = "%E6%88%A6%E8%89%A6%E5%B8%9D%E5%9B%BD"
Run Code Online (Sandbox Code Playgroud)
正如评论中所指出的,这在很大程度上是一个规范问题。我没有非打印 unicode 表达式的枚举。我只能观察到可以将 unicode 字符串粘贴到浏览器 Input 中,而没有意识到其中包含未显示的字符。我假设浏览器中的某些逻辑决定了每个 unicode 字符是否会显示某些内容。如果我可以将相同的逻辑应用于底层字符串以获得“显示字符串”,那么这个问题将得到解决。
换句话说:对于在浏览器上看起来相同的任何两个 unicode 字符串,我需要一个转换来保证它们的值是相同的。
我想创建一个凯撒密码,它可以从整个Unicode(私有使用区域除外)编码/解码unicode可打印字符(单和多码点字形集群,表情符号等).优选地,它将使用所有可打印字符的列表.
注意:即使我想创建一个caesar密码,它实际上不是关于加密.问题是关于调查unicode的属性.
我发现了这些问题:
但我没有得到我想要的答案.
注意:如果您给出编码答案,我最感兴趣的是使用python3或perl6的解决方案,因为它们是我的主要语言.
最近,我被赋予编写凯撒密码的任务,然后对英文文本进行编码和解码.
我通过使用字符串库的内置string.printable常量在python中解决了它.这是常量的打印输出:(我使用了visual studio代码)
文档说:'''ASCII字符串,被认为是可打印的.这是数字,ascii_letters,标点符号和空格的组合.''' https://docs.python.org/3.6/library/string.html#string-constants
以下是我对可打印字符的含义的理解:
当我将python字符串常量保持在上面,并使用键盘上的左侧或方向箭头键遍历它时,我只需要100个笔画即可到达末尾(与字符数相同).看起来在作为可打印字符和可以通过箭头键的一个笔划进行遍历之间存在一对一的对应关系.
现在考虑这个字符串:
"ijक्षि"
基于pythons string.printable常量,这个字符串在我看来由以下7个可打印字符组成:(您可以在以下位置查找各个代码点:https://unicode-table.com/en/)
1(家庭)2(拉丁小Ligature Ij)3(cariage return)4(Devanagari kshi)5(空间)6(零宽度不间断空间)7(黑桃王牌)
代码点:128104 8205 128105 8205 128103 8205 128102(参考:https://emojipedia.org/family-man-woman-girl-boy/ )
(Latin Small Ligature Ij)ijcodepoint:307
(回车)代码点:13
(Devanagari kshi)क्षिcodepoints:2325 2381 2359 2367
(参见本页:http://unicode.org/reports/tr29/ )(代码点似乎是十六进制而不是数字)
(空格)码点:32
(零宽度不间断空间)代码点:65279(AKA U + FEFF BYTE ORDER MARK(BOM))(https://en.wikipedia.org/wiki/Byte_order_mark)
(黑桃牌扑克牌)代号:127137
当我将这个字符串粘贴到记事本中,并尝试用箭头键遍历它时,我最终使用了10个键击而不是7个键,因为家族表情符号需要4个键击(可能是因为记事本无法处理零宽度连接符,代码点:8205,当然记事本不能显示家庭标志符号).另一方面,当我将字符串发布到谷歌搜索时,我可以用7个笔画遍历整个字符串.
然后我尝试在Perl6中创建字符串以查看Perl6的字形意识对字符串的影响:
(我使用Atom编辑器)
perl6认为Devanagari kshi角色(4个代码点)实际上是2个字形,每个字形有2个代码点.即使它可以表示为两个字符,如上面的列表所示,我认为这是一个错误.Perl6应该是字形意识,甚至我的Windows记事本(和谷歌搜索)认为它是一个字素/字符.
基于2个字符串,可打印字符的实际定义似乎是这样的:'它是任何unicode代码点的组合,可以在理想的环境下通过键盘上的一个左或右箭头键来遍历.
"在理想环境下"意味着您正在使用的环境可以说就像谷歌搜索一样:也就是说,它可以识别例如表情符号(4人家族)或字形集群(梵文字符)作为一个可打印的字符.
3个问题:
1:以上是unicode中可打印字符意味着什么的公平定义?
2:无论你是否接受这个定义,你知道任何覆盖当前使用的unicode平面和可能的字形集群的可打印字符列表,而不仅仅是python字符串库所拥有的100个ASCII字符(如果我有这样的列表)我想我可以很容易地创建一个密码)?
3:鉴于这样的列表不存在,并且您接受该定义,您将如何创建这样一个列表,我可以创建一个凯撒密码,可以在给定以下4个条件的情况下加密任何/所有可打印字符?
注意:这4个条件正是我想象的适当的凯撒密码所需要的.
条件a
要加密的字符串将是一个有效的utf8字符串,包含标准的unicode代码点(没有未分配的或私有的区域代码点)
条件b
加密字符串也必须是由标准unicode代码点组成的有效utf8字符串. …
我正在尝试从Golang中的字符串中删除不可打印的字符。
https://play.golang.org/p/Touihf5-hGH
invisibleChars := "Douglas?"
fmt.Println(invisibleChars)
fmt.Println(len(invisibleChars))
normal := "Douglas"
fmt.Println(normal)
fmt.Println(len(normal))
Run Code Online (Sandbox Code Playgroud)
输出:
Douglas?
10
Douglas
7
Run Code Online (Sandbox Code Playgroud)
第一个字符串的末尾有一个不可见的字符。
我尝试替换非ASCII字符,但它也删除了重音符号。
如何仅删除不可打印的字符?