Em Dash处理php和rails之间的区别

时间:2014-07-30 16:55:10

标签: php ruby-on-rails unicode

我正在将应用程序从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.

1 个答案:

答案 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中搞砸了。但这只是一个小案例,我只是清除了数据并再次导入它。