我使用Codeigniter的时间不长,但我遇到了一些字符集问题.我在CI论坛上问过,但我想更进一步,仍然没有全球解决方案:http://codeigniter.com/forums/ viewthread/204409 /
问题是数据库错误1064.我有一个解决方案,使用iconv!工作正常,但我认为没有必要.我在互联网上搜索charset等等,但我现在正在使用CI,如何使用charsets和CI ...
所以我对此提出了很多疑问,希望有人能为我说清楚:
设置charset全局的最佳方法是什么?什么设置?
在头上
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
在config/config.php中
$config['charset'] = 'UTF-8';
在config/database.php中
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
在.htaccess中,我的重写规则和
php_value magic_quotes_gpc Off
AddDefaultCharset UTF-8
还需要发送标题吗?在哪里放置?就像是?
header('Content-Type: text/html; charset=UTF-8');
在我的编辑器(Notepad ++)中将文件保存为UTF-8?还是UTF-8(没有BOM)?或者ANSI是好的(这是我现在使用的)?
使用utf8_unicode_ci或utf8_general_ci作为MySQL数据库?为什么?
如何阅读RSS源,如何处理多个字符集?在我工作的地方,我有两个输入,一个使用UTF-8编码,另一个使用ISO-8859-1.这将存储在数据库中,有时会进行比较以查看是否有新项目.它在特殊字符上失败了.
我正在使用: - CI 2.0.3 - PHP 5.2.17 - MySQL 5.1.58
更多信息:
模型:
function update_favorite($data)
{
$this->db->where('id', $data['id']);
$this->db->where('user_id', $data['user_id']);
$this->db->update('favorites', $data);
return;
}
Run Code Online (Sandbox Code Playgroud)
控制器:
$this->favorites_model->update_favorite(array(
'id' => $id,
'rss_last' => $rss_last,
'user_id' => $this->session->userdata('user_id')
));
Run Code Online (Sandbox Code Playgroud)
当$ rss_last是一个"正常"值,如:"test"(没有引号),它工作正常.当它是一个更长的值(荷兰语)时:F-Secure vindt恶意软件遇到了证书van Maleisische …
我在另一个答案中找到了一个有用的功能,我想知道是否有人可以向我解释它在做什么以及它是否可靠.我正在使用mb_detect_encoding()但是在从Linux操作系统上的ISO8859-1文件中读取时它已被删除.
这个功能似乎适用于我测试过的所有情况.
这是一个问题:获取文件编码
这是功能:
function isUTF8($string){
return preg_match('%(?:
[\xC2-\xDF][\x80-\xBF] # Non-overlong 2-byte
|\xE0[\xA0-\xBF][\x80-\xBF] # Excluding overlongs
|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # Straight 3-byte
|\xED[\x80-\x9F][\x80-\xBF] # Excluding surrogates
|\xF0[\x90-\xBF][\x80-\xBF]{2} # Planes 1-3
|[\xF1-\xF3][\x80-\xBF]{3} # Planes 4-15
|\xF4[\x80-\x8F][\x80-\xBF]{2} # Plane 16
)+%xs', $string);
}
Run Code Online (Sandbox Code Playgroud)
这是检测UTF8字符串的可靠方法吗?到底是做什么的?它可以变得更强大吗?
我想在将丹麦字符发送到数据库之前对其进行编码。
我尝试将此功能应用于他们:
private function process_array_elements(&$element){
$element = utf8_encode($element);
$element = strip_tags( $element );
$element = strtolower ( trim ( $element ) );
$element = mysql_real_escape_string($element);
return $element;
}
Run Code Online (Sandbox Code Playgroud)
像这样:
$this->check_line_two = $this->process_array_elements($e);
Run Code Online (Sandbox Code Playgroud)
现在,每当我尝试将字符串发送到数据库时:
mysql_query("SET NAMES 'utf8'");
$query="INSERT INTO result_scanned
SET line_one= '$this->check_line_one',
line_two='$this->check_line_two',
line_three='$this->check_line_three',
advert_id='$this->advert_id',
scanned='$this->scan_result'";
Run Code Online (Sandbox Code Playgroud)
我明白了:
Incorrect string value: '\xE3\x83\xE2\xB8r ...' for column 'line_three' at row 1
Run Code Online (Sandbox Code Playgroud)
表中字段的数据类型是 UTF-8 ( utf8_unicode_ci),因此我必须使用相同的格式对我的字符串进行编码
这个线程与我的问题有关:Detect encoding and make everything UTF-8。
但是,在将任何字符插入数据库之前,我需要知道如何将其编码为 UTF-8,否则,我会收到上述错误。我想在将它们放入数据库之前,我需要首先确定我收到的字符类型。
我使用PHP Simple HTML DOM Parser http://simplehtmldom.sourceforge.net/从其他域获取页面标题,元描述和元标记等数据,然后将其插入数据库.
但我有一些编码问题.问题是我没有从那些不是英语的网站上得到正确的字符.
以下是代码:
<?php
require 'init.php';
$curl = new curl();
$html = new simple_html_dom();
$page = $_GET['page'];
$curl_output = $curl->getPage($page);
$html->load($curl_output['content']);
$meta_title = $html->find('title', 0)->innertext;
print $meta_title . "<hr />";
// print $html->plaintext . "<hr />";
?>
Run Code Online (Sandbox Code Playgroud)
facebook.com页面输出
Welcome to Facebook — Log in, sign up or learn more
amazon.cn页面输出
亚马逊-网上è´ç‰©å•†åŸŽï¼šè¦ç½‘è´, å°±æ¥Z.cn!
mail.ru页面输出
Mail.Ru: почта, поиÑк в интернете, новоÑти, игры, развлечениÑ
因此,字符未被正确编码.
任何人都可以帮助我如何解决这个问题,以便我可以将正确的数据添加到我的数据库中.