我需要查找并删除字符串中的所有非标准ascii字符(通常由MS Word提供)。我不完全确定这些角色是什么......比如花哨的撇号和双向引号以及所有这些。那是unicode吗?我知道怎么做火腿[a-z等等],但我希望有一种更优雅的方式来排除键盘上没有的东西。
答案 0 :(得分:2)
处理这个问题的最好方法可能是使用字符集,是的,但是对于它的价值,我已经通过这种快速而肮脏的方法取得了一些成功,角色类
[\x80-\x9F]
这是有效的,因为对我来说“Word chars”的问题是Unicode中非法的问题,而且我无法清理用户输入。
答案 1 :(得分:1)
Microsoft应用程序因使用花式字符(如引号,em-dashes等)而臭名昭着,需要特殊处理而不添加任何实际值。在某些情况下,您所要做的就是确保使用其中一个扩展字符集来读取文本(例如,windows-1252而不是ISO-8859-1)。但是,有一些工具可以用普通但普遍支持的等价物取代那些花哨的角色。 Google为“demoronizer”或“AsciiDammit”。
答案 2 :(得分:1)
我通常使用一个JEdit宏来代替它们中最常见的一个更友好的ascii版本,即:
它很容易适应Word / Openoffice /等等,当然也可以根据您的需要进行修改。我写了一篇关于这个主题的文章: http://www.megadix.it/node/138
干杯
答案 3 :(得分:0)
您可能正在看的是UTF-8格式的Unicode字符。如果是这样,只需用正则表达式语言转义它们。
答案 4 :(得分:0)
我解决这个问题的方法是编写一个Perl脚本,它给出了ASCII范围之外的所有字符(0 - 127):
#!/usr/bin/perl
use strict;
use warnings;
my %seen;
while (<>) {
for my $character (grep { ord($_) > 127 } split //) {
$seen{$character}++;
}
}
print "saw $_ $seen{$_} times, its ord is ", ord($_), "\n" for keys %seen;
然后,我创建了这些字符到我想要的字符的映射,并在文件中替换它们:
#!/usr/bin/perl
use strict;
use warnings;
my %map = (
chr(128) => "foo",
#etc.
);
while (<>) {
s/([\x{80}-\x{FF}])/$map{$1}/;
print;
}
答案 5 :(得分:0)
我要做的是,使用AutoHotKey或python SendKeys或某种可视基本,它会将所有可能的密钥(也包括已应用和未应用的移位)发送给Word文档。< / p>
在SendKeys中,它将是
形式的脚本chars = ''.join([chr(i) for i in range(ord('a'),ord('z'))])
nums = ''.join([chr(i) for i in range(ord('0'),ord('9'))])
specials = ['-','=','\','/',','.',',','`']
all = chars+nums+specials
SendKeys.SendKeys("""
{LWIN}
{PAUSE .25}
r
winword.exe{ENTER}
{PAUSE 1}
%(all)s
+(%(all)s)
"testQuotationAndDashAutoreplace"{SPACE}-{SPACE}a{SPACE}{BS 3}{LEFT}{BS}
{Alt}{PAUSE .25}{SHIFT}
changeLanguage
%(all)s
+%(all)s
"""%{'all':all})
然后我将文档保存为文本,并将其用作键盘布局中所有可置换键的数据库(您可能希望多次替换默认输入语言以接收绝对所有可显示的字符)。
如果char在结果文本文档中 - 它是可显示的,否则不是。不需要正则表达式。当然,您可以在字符或程序中嵌入字符范围。