我对我尝试写的函数感到绝望Perl.我的功能是过滤特定字符的字符串.我允许一些角色A-Z, a-z, 0-9,我想也允许一些德国变形金刚.但每次我在正则表达式中定义它们时,替换都会失败.
我的编码是UTF-8(server,perl,scripts).
这是我的功能:
sub cleanXSS{
my $string = shift;
$string =~ s/[^A-Za-z0-9öäü]//g;
return $string;
}
Run Code Online (Sandbox Code Playgroud)
我的脚本看起来像这样:
my $scalar = "áéíóúÁÉÍüÓÚâêÄîôßû()ÂÊÎÔÛabcäüöÄÜÖý#µzdjheäöü";
print cleanXSS($scalar)."\n";
Run Code Online (Sandbox Code Playgroud)
因此它应该替换除A-Z, a-z, 0-9小写变音符号以外的所有字符.在我的测试字符串中替换德语变音符合工作正常,但似乎所有其他拉丁字符只是部分替换.
控制台输出如下所示:
?????????ü??????????????abcäüö????zdjheäöü
Run Code Online (Sandbox Code Playgroud)
我尝试过很多解决方法,比如"使用locale",其他编码,通过"使用Encode"进行显式编码等等.
似乎在一个字符中,á只替换了2个字节中的1个.如果我将我的替换更改为:
$string =~ s/[^A-Za-z0-9öäü]/_/g;
Run Code Online (Sandbox Code Playgroud)
我得到以下输出:
?_?_?_?_?_ö?_?_?_ü?_?_?_?_?_?_?_?_?___?_?_?_?_?_abcäüö?_?_?_?____zdjheäöü
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
如何设置html页面的标题</title>?
我已经试过了>,<但它不起作用.
这是一个非常奇怪的错误,让我们看一下细节:
ts.py文件:
#-*- coding: utf-8 -*-
import requests
from lxml import html
headers = {
'Host':'www.baidu.com',
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36',
}
def get_html(url,enable_proxy=None):
r = requests.get(url,headers=headers)
parser = html.HTMLParser(encoding='utf-8')
return html.document_fromstring(r.text, parser=parser)
p = get_html('http://www.baidu.com')
print p.xpath(u'//*[@id="setf"]/text()')[0].encode('utf-8')
Run Code Online (Sandbox Code Playgroud)
如果我只执行ts.py,lxml就可以完美运行.
但是!当我get_html输入另一个文件时出现错误,请参阅以下内容:
ts.py:
#-*- coding: utf-8 -*-
import requests
from util import get_html
p = get_html('http://www.baidu.com')
print p.xpath(u'//*[@id="setf"]/text()')[0].encode('utf-8')
Run Code Online (Sandbox Code Playgroud)
util.py:
#-*- coding: utf-8 -*-
import requests
from lxml import html
headers = {
'Host':'www.baidu.com',
'User-Agent':'Mozilla/5.0 …Run Code Online (Sandbox Code Playgroud) 我有一个"包含"文本的字节数组 - 此时编码/字符集是未知的.
如何在不从字节数组创建String对象的情况下删除空格,\n,\ r \n字符?
目标是将字节数组显示为文本,并使用用户指定的字符集,只是没有这些空格,\n,\ r \n字符.
我试图将我的Perl/HTML文件更改为UTF-8格式.不幸的是我的表格有问题.我创建了一个小测试脚本来举例说明问题.它所做的只是重新加载,以便输入的文本将再次显示.它适用于ASCII字符.一进入德语"Umlaute"(ÄÖÜ),角色就会变形.它也无法处理俄语字符(ЭЯЮ).这是脚本:
#!/usr/bin/perl
use utf8;
use Encode;
use open ':std', ':encoding(UTF-8)';
# Safe query-string in hash:
$querystring = $ENV{ 'QUERY_STRING' };
read(STDIN, $poststring, $ENV{CONTENT_LENGTH});
if (($querystring ne "") && ($poststring ne "")) { $querystring .= "&$poststring"; }
else { $querystring .= $poststring; }
$querystring =~ s/&/=/gi;
%query = split( /=/, $querystring );
foreach $key ( keys( %query ) ) {
$query{$key} =~ tr/+/ /;
$query{$key} =~ s/%([\da-f][\da-f])/chr( hex($1) )/egi;
$uquer{$key} = decode_utf8( $query{$key} );
}
print "Content-Type: text/html; charset=\"UTF-8\"\n\n";
print <<END; …Run Code Online (Sandbox Code Playgroud) 我已尝试过多种方法将其编码为最终结果"BACK RUSHIN'",最重要的字符是右撇号'.
我想要一种方法来使用Python中的一些内置函数来获得最终结果,其中正常字符串和unicode字符串之间没有区别.
这是我用来检索字符串的代码: str(unicode(etree.tostring(root.xpath('path')[0],method='text', encoding='utf-8'),errors='ignore')).strip()
结果是:缺少'BACK RUSHIN'撇号的东西'.
另一种方式是: root.xpath('path/text()')
结果是:u'BACK RUSHIN\u2019'在python中.
最后,如果我尝试: u'BACK RUSHIN\u2019'.encode('ascii', 'replace')
结果是: 'BACK RUSHIN?'
请不要替换函数,我想利用pythons编解码库.也没有打印字符串,因为它被保存在变量中.
谢谢
我UnicodeEncodeError在我的Django项目中遇到了麻烦,最后通过更改故障__unicode__方法的返回值来解决问题(经过多次挫折)
return unicode("<span><b>{0}</b>{1}<span>".format(val_str, self.text))
Run Code Online (Sandbox Code Playgroud)
至
return u"<span><b>{0}</b>{1}<span>".format(val_str, self.text)
Run Code Online (Sandbox Code Playgroud)
但我很困惑为什么这样做(或者更确切地说,为什么首先出现问题).做u前缀和unicode功能做不一样的事?在控制台中尝试时,它们似乎给出了相同的结果:
# with the function
test = unicode("<span><b>{0}</b>{1}<span>".format(2,4))
>>> test
u'<span><b>2</b>4<span>'
>>> type(test)
<type 'unicode'>
# with the prefix
test = u"<span><b>{0}</b>{1}<span>".format(2,4)
>>> test
u'<span><b>2</b>4<span>'
>>> type(test)
<type 'unicode'>
Run Code Online (Sandbox Code Playgroud)
但似乎编码在某种程度上以不同的方式完成,具体取决于使用的内容.这里发生了什么?
我认为我做的事情正确:
$mail->CharSet = "UTF-8";但是电子邮件到来时会出现这种错误(单词被带有“?”符号的黑色四分之一字符打破:
更新1
在电子邮件的来源中找到了某种中文字形(但没有cyrillyc符号)
我正在努力将字符串从一个字符集转换为另一个字符串,并在其上阅读许多示例,最后找到下面的代码,这对我来说很好,作为Charset Encoding的新手,我想知道,如果这是正确的方法它.
public static byte[] transcodeField(byte[] source, Charset from, Charset to) {
return new String(source, from).getBytes(to);
}
Run Code Online (Sandbox Code Playgroud)
要将String从ASCII转换为EBCDIC,我必须这样做:
System.out.println(new String(transcodeField(ebytes,
Charset.forName("US-ASCII"), Charset.forName("Cp1047"))));
Run Code Online (Sandbox Code Playgroud)
要从EBCDIC转换为ASCII,我必须这样做:
System.out.println(new String(transcodeField(ebytes,
Charset.forName("Cp1047"), Charset.forName("US-ASCII"))));
Run Code Online (Sandbox Code Playgroud) 我目前正在使用Soap Web服务,更准确地说,是恢复发送的文件.
它是手动工作:
在SOAPUi中,我确实收到了这个(为了便于阅读而被截断)
JVBERi0xLjQKJeLjz9MKMTIgMCBVY [...]
dL0luZm8gMTggMCBSL1NpemUgMTk + PgpzdGFydHhyZWYKNjk5OQolJUVPRgo =
我可以在notepad ++中粘贴此字符串,然后在单击MIME Tools> base 64 Decode之后,它将成为一个正确的PDF文件,如下所示(截断,只显示标题)
%PDF-1.4%xE2xE3xCFxD3LF 12 0 obj <> stream
因此可以毫无问题地读取PDF文件.
现在问题是使用java恢复这些数据.我收到一个byte数组(下面的示例中的acopier变量)并使用以下代码存储到文件中.我尝试了在网上找到的众多例子中没有任何成功.
还尝试使用UTF-8,ISO-8859-1等.
OutputStreamWriter osw = null;
try{
String filePath="c:\\temp\\";
filePath = filePath.concat("test.pdf");
FileOutputStream fos = new FileOutputStream(filePath,false);
osw = new OutputStreamWriter(fos,"UTF-8");
osw.write("\uFEFF");
osw.write(new String(acopier));
osw.close();
System.out.println("Success");
fos.close();
}
catch(Exception e)
{
System.out.println(e.getMessage());
osw.close();
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,文件不能被视为pdf文件,
%PDF-1.4%ãÏÓ120 obj <>流
当我试图检查字节数组中的内容时,控制台向我显示:(截断)
%PDF - 1.4
%????
1 2 0
我认为windows或记事本++或者soapui正在后台做一些事情来猜测要使用什么字符集,但我不知道有什么方法可以去.
可以请有人澄清我如何从头开始在java(意味着从原始的字节数组)?
问候,
皮埃尔