草庐IT

php - Codeigniter 和字符集

coder 2024-04-06 原文

我使用 Codeigniter 的时间不长,但我遇到了一些字符集问题。我在 CI 论坛上四处询问,但我想更进一步,仍然没有全局解决方案:http://codeigniter.com/forums/viewthread/204409/

问题是数据库错误 1064。我有一个解决方案,使用 iconv!工作正常,但我认为没有必要。我在互联网上搜索了很多字符集等,但我现在正在使用 CI,字符集和 CI 怎么样......

所以我对此有很多疑问,希望有人能为我说清楚:

设置全局字符集的最佳方法是什么?以及设置什么?

  • 在头上

    <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 好(这就是我现在使用的)?

  • 对 MySQL 数据库使用 utf8_unicode_ci 或 utf8_general_ci?为什么?

  • 如何阅读 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;
}

Controller :

$this->favorites_model->update_favorite(array(
 'id' => $id, 
 'rss_last' => $rss_last,
 'user_id' => $this->session->userdata('user_id')
)); 

当 $rss_last 是一个“正常”值,如“test”(不带引号)时,它工作正常。 当它是一个更长的值时,例如(荷兰语):F-Secure vindt malware met certificaat van Maleisische overheid

我收到这个错误:

Error Number: 1064

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘vindt malware met certificaat van Maleisische overheid, user_id = ‘1’ WHERE `i’ at line 1

UPDATE favorites SET id = ‘15’, rss_last = F-Secure vindt malware met certificaat van Maleisische overheid, user_id = ‘1’ WHERE id = ‘15’ AND user_id = ‘1’

Filename: /home/.../domains/....nl/public_html/new/models/favorites_model.php

Line Number: 35

CI 论坛有人告诉我用这个:

'rss_last' => iconv("UTF-8", "UTF-8//TRANSLIT", $rss_last) 

这很好用,但我认为这不是必需的..

如前所述,$rss_last 值来自 RSS 提要,有时是 UTF-8 编码,有时是 ISO-8859-1 编码:

$rss = file_get_contents('http://www.website.com/rss.xml');
$feed = new SimpleXmlElement($rss);
$rss_last = $feed->channel->item[0]->title;

看起来这最后一部分是问题所在,当 $rss_last 设置为它工作正常的值时:

$rss_last = 'F-Secure vindt malware met certificaat van Maleisische overheid';

当值从 RSS 中出来时,它会出现问题...

还有一些问题..

刚找到这个:Detect encoding and make everything UTF-8

最佳解决方案?但是.. iconv 不是更简单,做这样的事情:

$encoding = some_function_to_get_encoding_from_feed($feed);
$rss_last = iconv($encoding, "UTF-8//TRANSLIT", $feed->channel->item[0]->title);

但是“some_function_to_get_encoding_from_feed”有什么用呢? mb_detect_encoding?

和 mb_convert_encoding vs iconv?

最佳答案

1) 没有全局解决方案。

2)

AddDefaultCharset UTF-8

Apache 需要以正确的编码响应客户端。做到这一点。

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

不一定,但 W3C 推荐。

$config['charset'] = 'UTF-8';

这是可取的

$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';

CI 连接到数据库的编码。如果您的数据库编码是 UTF-8 - 将其设为强制性。

header('Content-Type: text/html; charset=UTF-8');

除非必要,否则不要这样做。字符集已在 HTML 代码和 .htaccess 中指明。

Use utf8_unicode_ci or utf8_general_ci for the MySQL database? And why?

对于他们自己的语言(俄语),我使用 utf8_general_ci。

In my editor (Notepad++) save files as UTF-8?

当然! Apache 将以 UTF8 格式提供的所有代码都应采用 UTF8 格式。

How about reading RSS feeds, how to handle multiple charsets?

如果您在每个表中都有每个 RSS - 您可以为每个表指定字符集并为每个 sql 查询设置正确的编码。 是的,例如,西里尔符号在非 UTF8 上会失败。

关于php - Codeigniter 和字符集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8156900/

有关php - Codeigniter 和字符集的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. Ruby 解析字符串 - 2

    我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?

  3. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  4. ruby-on-rails - unicode 字符串的长度 - 2

    在我的Rails(2.3,Ruby1.8.7)应用程序中,我需要将字符串截断到一定长度。该字符串是unicode,在控制台中运行测试时,例如'א'.length,我意识到返回了双倍长度。我想要一个与编码无关的长度,以便对unicode字符串或latin1编码字符串进行相同的截断。我已经了解了Ruby的大部分unicode资料,但仍然有些一头雾水。应该如何解决这个问题? 最佳答案 Rails有一个返回多字节字符的mb_chars方法。试试unicode_string.mb_chars.slice(0,50)

  5. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  6. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  7. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  8. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  9. ruby - 如何使用文字标量样式在 YAML 中转储字符串? - 2

    我有一大串格式化数据(例如JSON),我想使用Psychinruby​​同时保留格式转储到YAML。基本上,我希望JSON使用literalstyle出现在YAML中:---json:|{"page":1,"results":["item","another"],"total_pages":0}但是,当我使用YAML.dump时,它不使用文字样式。我得到这样的东西:---json:!"{\n\"page\":1,\n\"results\":[\n\"item\",\"another\"\n],\n\"total_pages\":0\n}\n"我如何告诉Psych以想要的样式转储标量?解

  10. ruby 正则表达式 - 如何替换字符串中匹配项的第 n 个实例 - 2

    在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg

随机推荐