我目前正在通过PHP和sqlsrv_connect协议查询MS SQL Server数据库。在我的表格中,有一列包含文件位置:
\\ FILESERVER123 \ IDImages \ Photos \ 003741.jpg
然后我利用PHP的str_replace()将其转换为URL:
$imglink = str_replace('\\\\FILESERVER123\\IDImages\\Photos','http://webserver/idphotos/',$row['SeeExampleAbove'])
“ 003”在某些时候被转换为上标“ L”。它似乎是在初始查询中发生的,而不是在str_replace()期间发生的,但是我茫然地知道为什么,这次我的Google技能没有帮助。
与字符编码有关吗?
答案 0 :(得分:0)
在“照片”后面没有转义\。因此,您在最终网址中以\结尾。 – kainaw 27分钟前
就这么简单。我花了很多时间来解决这一问题。感谢大家的答复。
答案 1 :(得分:0)
在“照片”后面没有转义\。因此,您在最终到达的网址中以\结尾。
那样只是为了您可以将其作为正确答案。但是,由于这是一个答案,我认为有必要进行解释...
对于大多数编程语言(包括PHP),\字符用作字符串中的转义字符。在“和”之间(通常也在“和”之间),\用来表示后面的字符具有特殊含义。例如,“ This \”打印引号。“ \”表示\后面的“不是字符串的结尾。
由于\具有特殊含义,要打印\,您需要使用\对其进行转义。两个\字符被解释为单个。
许多语言允许您使用\来使用代码输入字符。您键入\,然后键入所需字符的数字代码。在此问题中,\后跟一个数字(一个示例中为003,另一示例中为011)。计算机将这些字符转换为字符(可能是unicode字符)。
此问题的根源是Windows或确切地说是MS-DOS。早于MS-DOS(和Windows),分层文件系统使用/分隔目录和文件。由于未知原因,QDOS(由于MS-DOS)选择使用。现在,当Windows用户引用文件系统中的某个位置时,他或她必须将所有\字符转义为\。但这并不需要那么难。我已经在Windows 7和10中试用过PHP。如果我引用“ c:/users/myuser/downloads/somefile.jpg”,它就可以正常工作。 PHP的文件处理程序了解我正在输入/,但它需要在操作系统中使用\。它为我翻译(是第4代编程语言!)。因此,可以通过从一开始就将所有\字符替换为/字符来解决整个问题。
最终发生的情况是,替换文件的路径名中留下一个\。那不是逃避为\,而是被翻译为特殊字符。