UTF-8和德语字符?

8

我在我的网站中遇到了德语字符的问题,

在网站的 HTML/PHP 部分中,我有以下代码来设置 utf-8:

<meta charset="utf-8">

在MySQL中,我有这段代码来设置UTF-8编码。
SET CHARSET 'utf8';
  1. 以下是关于德语单词 "Gemäß" 的翻译:

  2. 以下是该单词在 MySQL 表格中的展示:

    Gem&Atilde;&curren;&Atilde;Ÿ

  3. 以下是网站上该单词的展示方式:Gemäß

有什么问题吗?谢谢。


1
你是怎么把它放进数据库的?如果你声称发送的是utf-8,但实际上只是扔了latin-1字节,那么设置字符集也没有帮助。 - Wooble
你必须确保插入的字符串采用相同的编码方式,就像@Wooble所说的那样。仅仅因为网站的元标记显示为UTF-8,并不意味着你代码中的字符串也是UTF-8编码(尽管我一直认为UTF-8是默认编码方式...但我现在发现我也可能做错了一些事情)。 - Geeky Guy
在我的connection.php文件中有这段代码:mysql_set_charset('utf8');我是这样插入数据的: mysql_query("INSERT INTO slike(title,string,material,price,dimensions,lang,currency) VALUES('$title','$code','$material','$price','$dimensions','$lang','$price')") or die(mysql_error()); - user1814358
1
可能是UTF-8 all the way through的重复问题。 - deceze
你的数据库仍然存在错误编码,你应该无论如何修复它。 - Aris
9个回答

2

我使用了这段代码来获取标题:

$title = mysql_real_escape_string(htmlentities($_POST['title']));

我只是将其覆盖为

$title = $_POST['title'];

使用mysql_*已经过时,而mysql_real_escape_string也无法保证您的数据库安全。顺便说一下。 - Jonast92
2
现在你确实有一个错误,而第一条语句只是混淆了你的输出,你现在让它变得危险了。始终为适当的输出转义数据,并且仅为此输出转义。要在HTML页面上显示数据,应使用htmlspecialchars(),要在SQL语句中插入字符串,请使用mysqli_real_escape_string()或参数化查询。 - martinstoeckli
@Jonast92,mysql_real_escape_string在正确使用的情况下是完全足够防止SQL注入的。问题在于许多人没有正确使用它。 - deceze
当然,这可能会有所帮助,但仅仅应用它并不能起到太大的作用,例如它无法保护您免受逻辑 SQL 注入攻击。你也可以跳过它,但如果所有其他安全措施都被使用了,那么应用它也不会有坏处。 - Jonast92
@Jonast92 什么?我希望你能澄清你在这里的观点:https://dev59.com/Xmcs5IYBdhLWcg3wmlWk - deceze

1

首先,请确保您的数据库中有UTF-8字符。

之后,在连接到MySQL后尝试使用SET NAMES 'UTF8'

$con=mysqli_connect("host", "user", "pw", "db");   
if (!$con)
{
    die('Failed to connect to mySQL: ' .mysqli_connect_errno());
}

mysqli_query($con, "SET NAMES 'UTF8'") or die("ERROR: ". mysqli_error($con));

正如手册所述:

SET NAMES指示客户端将使用哪个字符集向服务器发送SQL语句... 它还指定了服务器用于将结果发送回客户端的字符集。


0

您需要为php 5.x执行此操作。

$yourNiceLookingString = 
htmlspecialchars ($YourStringFromDB, ENT_COMPAT | ENT_HTML401, 'ISO-8859-1');

并且适用于 php 4.x

  $yourNiceLookingString = htmlspecialchars($YourStringFromDB);

0

我曾经遇到过同样的问题,解决方法是使用以下代码:

如果你已经创建了表格,你需要修改字符集如下:

alter table <table name> convert to character set utf8 collate utf8_general_ci.

MySQL默认将您的表字符集设置为latin_swedish

此外,当检索数据并将其显示到页面时,您可能会遇到一些问题。为此,请在连接数据库的行下方包含:mysql_set_charset('utf8')。 例如:

mysql_connect('localhost','root','');
mysql_select_db('my db');
mysql_set_charset('utf8');

0

在HTML5中使用

<meta charset="utf-8">

在 HTML 4.0.1 中使用

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

0
尝试使用 SET NAMES 'utf8'SET NAMES 'utf-8'。其中一些适用于葡萄牙语,可能也适用于德语。我只是想不起来哪个是正确的,但如果不是正确的话,就会产生错误。

0

你应该确保连接也是 utf-8 编码。

使用 mysqli 可以像这样完成:

$connection = mysqli_connect($host, $user, $pass, $db_name);
$connection->set_charset("utf8");

如果你的数据库中出现了错误字符,有一种方法可以纠正它:

  1. 在 PHP 脚本中,像平常一样检索信息,即不设置连接。这样错误就会被反转和纠正,在你的 PHP 文件中,字符将以正确的 UTF-8 格式显示。
  2. 在 PHP 脚本中,写回信息时设置连接为 utf-8
  3. 此时,你应该能够在数据库中看到正确的字符
  4. 现在,将你网站的所有读/写函数都改为从现在开始使用 utf-8

0

在你的数据库中设置数据类型也使用UTF-8,这应该可以解决问题。


0

结果被 HTML 实体编码,就好像它们是通过 htmlentities() 处理的一样。我想知道你的变量是从表单中接收到的还是被某个所见即所得编辑器处理过了?

无论如何,在 HTML 模板上应该可以正常打印这些内容,但也可以使用 html_entity_decode() 函数进行解码。

希望这能帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接