我想我需要删除0-31和127的字符,
是否有一个函数或一段代码来有效地执行此操作.
我有一个应用程序来处理来自世界各地的客户,当然,我希望进入我的数据库的所有内容都是UTF-8编码的.
对我来说主要的问题是我不知道任何字符串的来源是什么编码 - 它可以来自文本框(使用<form accept-charset="utf-8">仅在用户实际提交表单时才有用),或者它可能是从上传的文本文件,所以我真的无法控制输入.
我需要的是一个函数或类,它确保进入我的数据库的内容尽可能采用UTF-8编码.我已经尝试iconv(mb_detect_encoding($text), "UTF-8", $text);
但是有问题(如果输入是'fiancée'它返回'fianc').我尝试了很多东西= /
对于文件上传,我喜欢要求最终用户指定他们使用的编码,并向他们展示输出结果的预览,但这对于讨厌讨厌的黑客没有帮助(事实上,它可以使他们的生活更容易一点).
我已经阅读了关于这个主题的其他SO问题,但它们似乎都有微妙的差异,例如"我需要解析RSS提要"或"我从网站上搜集数据"(或者,实际上,"你不能").
但必须有一些东西至少有一个好的尝试!
由于某种原因,项目"description"返回NULL以下代码:
<?php
include('db.php');
$result = mysql_query('SELECT * FROM `staff` ORDER BY `id` DESC LIMIT 2') or die(mysql_error());
$rows = array();
while($row = mysql_fetch_assoc($result)){
$rows[] = $row;
}
echo json_encode($rows);
?>
Run Code Online (Sandbox Code Playgroud)
这是我的数据库的架构:
CREATE TABLE `staff` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` longtext COLLATE utf8_unicode_ci,
`description` longtext COLLATE utf8_unicode_ci,
`icon` longtext COLLATE utf8_unicode_ci,
`date` longtext COLLATE utf8_unicode_ci,
`company` longtext COLLATE utf8_unicode_ci,
`companyurl` longtext COLLATE utf8_unicode_ci,
`appurl` longtext COLLATE utf8_unicode_ci,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
Run Code Online (Sandbox Code Playgroud)
以下是页面上的回显: …
我想从JavaScript中的字符串中删除所有无效的UTF-8字符.我试过这个JavaScript:
strTest = strTest.replace(/([\x00-\x7F]|[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3})|./g, "$1");
似乎这里描述的UTF-8验证正则表达式(已删除链接)更完整,我以相同的方式调整它:
strTest = strTest.replace(/([\x09\x0A\x0D\x20-\x7E]|[\xC2-\xDF][\x80-\xBF]|\xE0[\xA0-\xBF][\x80-\xBF]|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}|\xED[\x80-\x9F][\x80-\xBF]|\xF0[\x90-\xBF][\x80-\xBF]{2}|[\xF1-\xF3][\x80-\xBF]{3}|\xF4[\x80-\x8F][\x80-\xBF]{2})|./g, "$1");
这两段代码似乎都允许有效的UTF-8通过,但是我的测试数据中几乎没有过滤任何坏的UTF-8字符:UTF-8解码器功能和压力测试.要么坏字符没有变化,要么删除了一些字节,从而创建一个新的无效字符.
我不是很熟悉UTF-8标准或JavaScript中的多字节,所以我不确定我是否未能在正则表达式中表示正确的UTF-8,或者我是否在JavaScript中不正确地应用该正则表达式.
编辑:根据Tomalak的评论为我的正则表达式添加了全局标志 - 但是这仍然不适合我.根据bobince的评论,我放弃了在客户端这样做.
我必须在Java中处理这种情况:
我从声明为encoding = utf-8的客户端获取XML格式的请求.不幸的是,它可能不包含utf-8字符,并且需要从我这边的xml中删除这些字符(遗留).
让我们考虑这个无效XML包含£(磅)的示例.
1)我得到xml作为带有£的java字符串(我现在没有访问接口,但我可能得到xml作为java字符串).我可以使用replaceAll(£,"")来摆脱这个角色吗?任何潜在的问题?
2)我得到xml作为字节数组 - 在这种情况下如何安全地处理这个操作?
我有脏数据.有时它包含像字符这样.我使用这些数据来进行查询
WHERE a.address IN ('mydatahere')
Run Code Online (Sandbox Code Playgroud)
对于这个角色我得到了
org.hibernate.exception.GenericJDBCException:操作'IN'的非法混合排序(utf8_bin,IMPLICIT),(utf8mb4_general_ci,COERCIBLE),(utf8mb4_general_ci,COERCIBLE)
如何过滤掉这样的字符?我用的是Java.
谢谢.
如何以多字节安全方式从字符串中删除字符,如标点符号,逗号,短划线等?
我将使用来自许多不同语言的输入,我想知道是否有什么东西可以帮助我
谢谢
我在MySQL中有一个类型为text的字段,使用以下排序规则:utf8_general_ci.
使用使用DOMDocument构建的变量填充此XML字段:
function ed_audit_node($dom, $field, $new, $old){
//create audit_detail node
$ad = $dom->createElement('audit_detail');
$fn = $dom->createElement('fieldname');
$fn->appendChild($dom->createTextNode($field));
$ad->appendChild($fn);
$ov = $dom->createElement('old_value');
$ov->appendChild($dom->createTextNode($old));
$ad->appendChild($ov);
$nv = $dom->createElement('new_value');
$nv->appendChild($dom->createTextNode($new));
$ad->appendChild($nv);
//append to document
return $ad;
}
Run Code Online (Sandbox Code Playgroud)
这是我如何保存到db($ xml来自$ dom-> saveXML()):
function ed_audit_insert($ed, $xml){
global $visitor;
$sql = <<<EOF
INSERT INTO ed.audit
(employee_id, audit_date, audit_action, audit_data, user_id)
VALUES (
{$ed[emp][employee_id]},
now(),
'{$ed[audit_action]}',
'{$xml}',
{$visitor[user_id]}
);
EOF;
$req = mysql_query($sql,$ed['db']) or die(db_query_error($sql,mysql_error(),__FUNCTION__));
//snip
}
Run Code Online (Sandbox Code Playgroud)
请参阅一个较旧的,平行的,稍微相关的关于我如何创建此XML的线程: 另一个PHP XML解析错误:"输入不正确的UTF-8,表示编码!"
有效: - 查询数据库,选择字段并使用jQuery(.ajax())输出并填充textarea.Firebug和textarea匹配数据库中的内容(与Toad确认).
什么不起作用 …
我想用引号替换无效的UTF-8字符(PHP 5.3.5).
到目前为止,我有这个解决方案,但删除了无效字符,而不是被'?'取代.
function replace_invalid_utf8($str)
{
return mb_convert_encoding($str, 'UTF-8', 'UTF-8');
}
echo mb_substitute_character()."\n";
echo replace_invalid_utf8('éééaaaàààeeé')."\n";
echo replace_invalid_utf8('eeeaaaaaaeeé')."\n";
Run Code Online (Sandbox Code Playgroud)
应输出:
63 // ASCII code for '?' character
???aaa???eé // or ??aa??eé
eeeaaaaaaeeé
Run Code Online (Sandbox Code Playgroud)
但目前产出:
63
aaaee // removed invalid characters
eeeaaaaaaeeé
Run Code Online (Sandbox Code Playgroud)
有什么建议?
你会用另一种方式(preg_replace()例如使用?)
谢谢.
我想允许所有 utf8 字符,但想用空格或 - 替换非 utf8
这是字符串
Punjab me 1Train k niche 100 Sardar aa gaye..
99 Mar gaye...
1 Bach gaya
Run Code Online (Sandbox Code Playgroud)
无论我做什么,它都不会在火车后插入
它在火车上的修剪
我已经尝试过这两个链接
我想要完整的 utf8 范围插入 mysql 并用空格或 - 替换非 utf8
$string = preg_replace('/[^(\x20-\x7F)]*/','', $string);
Run Code Online (Sandbox Code Playgroud)
适用于上述情况,但当我使用印地文/中文时,它也会替换它。所以我不能使用上面的代码
我是一名PHP初学者,在论坛上看到了这个PHP表达式:
我的PHP版本是5.2.X()
$regex = <<<'END'
/
( [\x00-\x7F] # single-byte sequences 0xxxxxxx
| [\xC0-\xDF][\x80-\xBF] # double-byte sequences 110xxxxx 10xxxxxx
| [\xE0-\xEF][\x80-\xBF]{2} # triple-byte sequences 1110xxxx 10xxxxxx * 2
| [\xF0-\xF7][\x80-\xBF]{3} # quadruple-byte sequence 11110xxx 10xxxxxx * 3
)
| ( [\x80-\xBF] ) # invalid byte in range 10000000 - 10111111
| ( [\xC0-\xFF] ) # invalid byte in range 11000000 - 11111111
/x
END;
Run Code Online (Sandbox Code Playgroud)
这段代码是否正确?做这些怪一样(对我来说)结构<<<,'END',/,/x,和END;是什么意思?
我的PHP版本不支持nowdoc,我应该如何替换这个表达式?没有引号'END'$ regex成了NULL …