Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在php中转换为十六进制与MSSQL不同_Php_Sql Server_Character Encoding_Hex - Fatal编程技术网

在php中转换为十六进制与MSSQL不同

在php中转换为十六进制与MSSQL不同,php,sql-server,character-encoding,hex,Php,Sql Server,Character Encoding,Hex,从对的回答中,我试图通过将字符串转换为十六进制并比较这些值,而不是直接危险地使用来自用户的字符串,使我的程序更加安全。我修改了该问题的代码以添加转换: function mssql_escape($data) { if(is_numeric($data)) return $data; $data = iconv("ISO-8859-1", "UTF-16", $data); $unpacked = unpack('H*hex', $data);

从对的回答中,我试图通过将字符串转换为十六进制并比较这些值,而不是直接危险地使用来自用户的字符串,使我的程序更加安全。我修改了该问题的代码以添加转换:

function mssql_escape($data) {
    if(is_numeric($data))
        return $data;

    $data = iconv("ISO-8859-1", "UTF-16", $data);

    $unpacked = unpack('H*hex', $data);

    return '0x' . $unpacked['hex'];
}
我这样做是因为在我的数据库中我使用nvarchar而不是varchar。现在,当我在php端运行它时,它会

0xfeff00680065006c006c006f00200077006f0072006c00640021
然后运行以下查询:

 declare @test nvarchar(100);
 set @test = 'hello world!';
 select CONVERT(VARBINARY(MAX), @test);
其结果是:

0x680065006C006C006F00200077006F0072006C0064002100

现在你会注意到这些数字几乎是一样的。除了尾随的零,唯一的区别是feff00。为什么会这样?我意识到我所要做的就是转换,但我真的想知道它为什么会在那里,而不是仅仅做一个假设。有谁能向我解释为什么php决定抛出feff00黄色!在我的魔咒前面?

安德鲁,我似乎回答了你的很多问题。说明:

因此,人们被迫想出了一个奇怪的习俗 在每个Unicode字符串的开头存储FE FF;这是 称为Unicode字节顺序标记,如果要交换高位和低位 低字节看起来像是FF FE和读取字符串的人 将知道它们必须每隔一个字节交换一次。呸。并非所有 野生的Unicode字符串在开头有一个字节顺序标记

维基百科解释道:

如果16位单位以大端字节顺序表示,则此BOM表 字符将按字节顺序显示为0xFE,后跟 0xFF。此序列在文本中显示为ISO-8859-1字符ÿÿ 预期文本为ISO-8859-1的显示

如果16位单元 使用小尾端顺序,字节序列将跟随0xFF 通过0xFE。该序列以ISO-8859-1字符ÿþ的形式出现在 预期文本为ISO-8859-1的文本显示

你用FEFF显示的代码,这意味着它是用大端符号表示的。对little endian使用UTF-16LE,SQL会理解这一点。只要只使用两个字节,移位前六个十六进制数字只能同时起作用