Lou*_*pax 6 php unicode sql-server-2008 codeigniter-2
我正在使用MS SQL Server和带有Active Record的CodeIgniter 2来处理我正在进行的项目,我只是偶然发现了这个问题:
当我提交包含中文或印地文字符的表单时,我将其存储在一个表中,当我查看它时,我得到的是问号.如果我尝试英文或希腊字符,一切似乎都很好.
我之所以认为这与我正在编写的PHP有关,是因为如果我直接在SQL Server Management Studio中复制粘贴中文文本,所有值都会在SQL Studio和SQL Studio上完美地存储和显示Web应用程序.
这些是我正在使用的数据库设置:
$db['local']['dbdriver'] = 'sqlsrv';
$db['local']['dbprefix'] = '';
$db['local']['pconnect'] = FALSE;
$db['local']['db_debug'] = TRUE;
$db['local']['cache_on'] = FALSE;
$db['local']['cachedir'] = '';
$db['local']['char_set'] = 'utf8';
$db['local']['dbcollat'] = 'utf8_general_ci';
$db['local']['swap_pre'] = '';
$db['local']['autoinit'] = TRUE;
$db['local']['stricton'] = FALSE;
Run Code Online (Sandbox Code Playgroud)
这是我正在测试的表的结构:
CREATE TABLE [dbo].[languages](
[id] [int] IDENTITY(1,1) NOT NULL,
[language] [nvarchar](1024) NULL,
[language_local] [nvarchar](1024) NULL,
[lang_code] [nvarchar](100) NULL,
[core] [bit] NULL,
CONSTRAINT [PK_languages] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
Run Code Online (Sandbox Code Playgroud)
这是我在config.php中的charset编码
$config['charset'] = 'utf-8';
Run Code Online (Sandbox Code Playgroud)
新故障排除数据
我试图通过我的表单保存以下字符串:Iñtërnâtiônàlizætiøn
CodeIgniter回复了这个错误:
An error occurred translating the query string to UTF-16: No mapping for the Unicode character exists in the target multi-byte code page. .
Run Code Online (Sandbox Code Playgroud)
当我尝试存储汉字时,这不会出现谢谢你提前:)
小智 9
尝试在插入到db之前使用iconv()转换输入:
$input = iconv('','UTF-8',$str);
Run Code Online (Sandbox Code Playgroud)
看起来这个答案得到了很多关注,我为没有发布问题的实际解决方案而感到难过......我猜取消选择我多年前选择的答案是不好的礼仪,所以我暂时不会。开始...
无需对设置进行任何更改。该问题与查询相关,不幸的是 CodeIgniter 不支持开箱即用的正确查询格式。
\n\n因此,当您想要在表中插入多字节字符时,必须N
在字符串之前添加该字符。
因此,在上面的示例中,查询应该如下所示才能工作
\n\nINSERT INTO test_table (title) VALUES (N\'I\xc3\xb1t\xc3\xabrn\xc3\xa2ti\xc3\xb4n\xc3\xa0liz\xc3\xa6ti\xc3\xb8n\')\n
Run Code Online (Sandbox Code Playgroud)\n\n不,CI 目前没有为您提供内置的方法来执行此操作。它计划添加到 CI4 中,但在此之前这里有一个为您准备的 hack
\n