我正在将应用程序从php迁移到rails,并且在em-dash的显示中遇到了一些问题。 我正在显示一个根据phpmyadmin和rails console的字段,其值为“Mon,Tue& Thu:上午8点 - 上午12点”。其中 - 应该是一个em-dash(长划线)。不知道为什么它以这种方式存储开始...
在php中我用<td><b>Opening Hours</b><br><?= nl2br($bar['opening_hours']) ?></td>
显示
这将呈现给Mon,Tue & Thu: 8 a.m. – 12 a.m.
在导轨中,我以苗条的= simple_format(@venue.opening_hours, style: "margin-bottom: 0px;")
显示。然而,这只是渲染到Mon,Tue & Thu: 8 a.m. – 12 a.m.
有没有人知道为什么会出现这种情况,为什么php会克服它?我在http://phpepl.cloudcontrolled.com/上尝试echo nl2br("Mon,Tue & Thu: 8 a.m. – 12 a.m.");
并按原样打印..
编辑:输出到error_log
会让我Mon,Tue & Thu: 8 a.m. \xe2\x80\x93 12 a.m.
答案 0 :(得分:0)
TL; DR - db数据编码是latin1,我的rails预计为utf-8。使用this script转换 - &gt;利润!
长版:
在@MarcBs评论之后,我看了一下我的phpmyadmin,并确认我的表格字符集确实设置为latin1
,排序规则设置为latin1_swedish_ci
。而且似乎php的mysql正在检测它,或者这是插件中的默认值。
要验证,我手动将php
期望的编码设置为utf-8
,并且presto,显示与我的rails应用程序完全相同。然而,奇怪的是,反过来没有用。当我将rails db编码设置为latin1
时,字符已更改,但未更改为正确的版本。无论这似乎是问题。
要将表格和数据转换为utf-8
,我首先尝试了How to convert an entire MySQL database characterset and collation to UTF-8?处提供的解决方案。他们不适合我。前端没有变化。
经过大量的故障排除和搜索后,我遇到了this script,它似乎做了我需要的工作。我在生产数据库的副本上运行它,它工作了!只是在那之后,我才通过它来了解它在做什么。它基本上将数据转换为二进制,然后在仅更改表配置的基础上再次返回到新的编码(utf-8
)。
通过这个过程,我的旧数据完好无损,但我最近导入的一些新数据已经毁了,因为它们与我原来的情况相反。它们是由rails脚本(utf-8
)导入latin1
数据库,这意味着它在rails中看起来很好但在php中搞砸了。但这只是一个小案例,我只是清除了数据并再次导入它。