我们刚刚将我们的一个Web应用程序(经典灯栈)从Ubuntu 14 / Apache 2.2 / PHP 5.5迁移到Ubuntu 16 / Apache 2.4 / PHP 7.0。一切都很顺利。目前只有一部分令我头疼:
我们的应用程序中的一个路由检查传入的文件请求,并通过XSendfile(第三方内容)传递该文件。文件传递的内容类型由应用程序显式设置。这意味着,例如,我们为text/html
文件附加了*.html
的内容类型。这非常顺利,浏览器收到了确切的内容类型。
现在,在新机器上(相同的代码和要传递的相同文件),浏览器收到的内容类型为text/html;charset=utf-8
。内容类型附加了一些字符集元数据。
这对我们来说非常糟糕,因为有些文件包含iso-8859-1
个编码内容。结果是显示的html文件中的编码错误。
我检查了一切。我们放置在HTTP标头中的内容类型是明确设置为而不是 utf-8字符集元数据。
现在我正在检查各种Apache2 / XSendfile特定配置,以获取有关该行为的任何提示。
有没有其他人在使用XSendfile的Apache 2.4上遇到过类似的行为?是不是,Apache发送的内容类型比html元标记中的内容类型更重要?如何禁用内容类型标题中charset元信息的自动附加?
答案 0 :(得分:0)
我遇到了一个完全相同的问题,导致Android应用程序原本期望import sqlite3
from sqlite3 import Error
dbs = []
def create_connection(db_file):
""" create a database connection to the SQLite database
specified by the db_file
:param db_file: database file
:return: Connection object or None
"""
try:
conn = sqlite3.connect(db_file)
return conn
except Error as e:
print(e)
return None
def select_all_data(conn):
"""
Query all rows in the table
:param conn: the Connection object
:return:
"""
cur = conn.cursor()
cur.execute("SELECT * FROM fund_table")
rows = cur.fetchall()
for row in rows:
print(row)
def select_name_and_db(conn):
"""
Query table by fund_name and db_name
:param conn: the Connection object
:return:
"""
cur = conn.cursor()
cur.execute("SELECT fund_name, db_name FROM fund_table")
rows = cur.fetchall()
for row in rows:
dbs.append({"fund_name": row[0], "db_name": row[1]})
return dbs
def main():
database = "edb.sqlite3"
# create a database connection
conn = create_connection(database)
with conn:
""" select_all_data(conn) """
select_name_and_db(conn)
main()
MIME逐字显示,并发现实际上是更新中更改了PHP配置。在PHP 5.6中,他们将默认的text/html
设置从default_charset
更改为""
。
您可以在适当的"UTF-8"
中进行更改,也可以在php.ini
调用之前简单地添加一个猴子补丁ini_set('default_charset', NULL);
。
default_charset字符串
在PHP 5.6及更高版本中,“ UTF-8”是默认值,如果省略了编码参数,则将其值用作htmlentities(),html_entity_decode()和htmlspecialchars()的默认字符编码... >
如果未通过header()调用覆盖标头,则所有版本的PHP都会将此值用作PHP发送的默认Content-Type标头中的字符集。
参考:http://php.net/manual/en/ini.core.php#ini.default-charset