代码之家  ›  专栏  ›  技术社区  ›  GloryFish

如何将Word智能引号和em破折号转换为字符串?

  •  25
  • GloryFish  · 技术社区  · 17 年前

    有时,用户会从包含智能引号或虚线的Word中粘贴文本。这些字符在数据库中显示为:“,”,

    将智能引号转换为常规引号,将虚线转换为常规虚线 ?

    更新:感谢到目前为止所有伟大的回应。Joel网站上关于编码的页面内容非常丰富: http://www.joelonsoftware.com/articles/Unicode.html

    MySQL数据库使用UTF-8编码。同样,显示内容的HTML页面通过显式设置元内容类型使用UTF-8(更新:)。

    在这些页面上,智能引号和虚线显示为带问号的菱形。

    解决方案:

    再次感谢您的回复。解决方案有两个方面:

    1. 文件被显式设置为使用
    2. htmlspecialchars() 而不是 htmlentities() .
    13 回复  |  直到 10 年前
        2
  •  9
  •   Ates Goral    17 年前

    mysql数据库使用UTF-8 编码。同样,html页面 显示正在使用的内容的

    HTML的内容可以是UTF-8格式,是的,但是您是否也明确地将HTML页面(通过PHP生成)的内容类型(编码)设置为UTF-8?尝试返回一个 Content-Type 页眉 "text/html;charset=utf-8" 或添加 <meta> 标记到您的HTMLs:

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

    这样,提交给PHP的数据的内容类型也将相同。

    <meta> tag为我工作。

        3
  •  4
  •   Kip    17 年前

    听起来真正的问题是数据库没有使用与页面相同的字符编码(可能应该是UTF-8)。在这种情况下,如果任何用户提交非ASCII字符,您可能会在数据库中看到奇怪的字符。仅仅查找和修复其中的一些(卷曲引号和em破折号)并不能解决真正的问题。

    migrating your database to another character encoding ,至少对于MySQL数据库。

        4
  •  2
  •   ConroyP    17 年前

    不幸的是,这是一个非常常见的问题,PHP对字符集的处理非常糟糕,这并没有帮助。

    我们所做的是强迫文本通过 iconv

    // Convert input data to UTF8, ignore any odd (MS Word..) chars
    // that don't translate
    $input = iconv("ISO-8859-1","UTF-8//IGNORE",$input);
    

    //IGNORE

    如果附加字符串//IGNORE,则无法在目标字符集中表示的字符将被自动丢弃。

        5
  •  1
  •   mspmsp    17 年前

    我们经常使用标准的字符串替换函数。尽管ASCII/Unicode在这种情况下的本质相当模糊,但它仍然有效。只需确保您的php文件以正确的编码格式保存,等等。

        6
  •  1
  •   Patrick McElhaney    17 年前

    accept-charset="utf-8"

        7
  •  1
  •   Greg    17 年前

    你可以试试 mb_ convert_encoding

    $str = mb_convert_encoding($str, 'UTF-8', 'ISO-8859-1');
    

    这假设您需要UTF-8,并且convert可以找到合理的替代品。。。如果没有,请自行更换。

        8
  •  1
  •   Joeri Sebrechts    17 年前

    实际上,这意味着运行一个名为“utf8”的查询集;

    http://www.phpwact.org/php/i18n/utf-8/mysql

        9
  •  1
  •   hawshy    15 年前

    mysql_set_charset('utf8',$link); 
    
        10
  •  1
  •   Peter O. Manuel Pinto    13 年前

    您必须手动将单个列的排序规则更改为UTF8;整体更改数据库不会改变这些。

        11
  •  1
  •   Jonathan Lidbeck    11 年前

    如果 您正在寻找这些字符在web上转义 保存 它们的外观,因此字符串将如下所示: “太好了!” 而不是 “太无聊了” ...

    您可以使用自己的自定义htmlEncode函数代替PHP函数来实现这一点 :

    $trans_tbl = false;
    
    function htmlEncode($text) {
    
      global $trans_tbl;
    
      // create translation table once
      if(!$trans_tbl) {
        // start with the default set of conversions and add more.
    
        $trans_tbl = get_html_translation_table(HTML_ENTITIES); 
    
        $trans_tbl[chr(130)] = '&sbquo;';    // Single Low-9 Quotation Mark
        $trans_tbl[chr(131)] = '&fnof;';    // Latin Small Letter F With Hook
        $trans_tbl[chr(132)] = '&bdquo;';    // Double Low-9 Quotation Mark
        $trans_tbl[chr(133)] = '&hellip;';    // Horizontal Ellipsis
        $trans_tbl[chr(134)] = '&dagger;';    // Dagger
        $trans_tbl[chr(135)] = '&Dagger;';    // Double Dagger
        $trans_tbl[chr(136)] = '&circ;';    // Modifier Letter Circumflex Accent
        $trans_tbl[chr(137)] = '&permil;';    // Per Mille Sign
        $trans_tbl[chr(138)] = '&Scaron;';    // Latin Capital Letter S With Caron
        $trans_tbl[chr(139)] = '&lsaquo;';    // Single Left-Pointing Angle Quotation Mark
        $trans_tbl[chr(140)] = '&OElig;';    // Latin Capital Ligature OE
    
        // smart single/ double quotes (from MS)
        $trans_tbl[chr(145)] = '&lsquo;'; 
        $trans_tbl[chr(146)] = '&rsquo;'; 
        $trans_tbl[chr(147)] = '&ldquo;'; 
        $trans_tbl[chr(148)] = '&rdquo;'; 
    
        $trans_tbl[chr(149)] = '&bull;';    // Bullet
        $trans_tbl[chr(150)] = '&ndash;';    // En Dash
        $trans_tbl[chr(151)] = '&mdash;';    // Em Dash
        $trans_tbl[chr(152)] = '&tilde;';    // Small Tilde
        $trans_tbl[chr(153)] = '&trade;';    // Trade Mark Sign
        $trans_tbl[chr(154)] = '&scaron;';    // Latin Small Letter S With Caron
        $trans_tbl[chr(155)] = '&rsaquo;';    // Single Right-Pointing Angle Quotation Mark
        $trans_tbl[chr(156)] = '&oelig;';    // Latin Small Ligature OE
        $trans_tbl[chr(159)] = '&Yuml;';    // Latin Capital Letter Y With Diaeresis
    
        ksort($trans_tbl);
      }
    
      // escape HTML      
      return strtr($text, $trans_tbl); 
    }
    
        12
  •  0
  •   Domenic    17 年前

    解决方案,但我会尝试测试以了解PHP看到了什么。假设它看到了“”(还有一些其他的可能性,比如简单的“”,或者“&8220;”)。然后执行str#u replace以去除所有这些,并用普通引号替换它们,然后将答案填充到数据库中。

    更好的解决方案可能包括使端到端数据通过所有UTF-8,因为人们正试图在其他答案中提供帮助。

        13
  •  0
  •   Community Mohan Dere    9 年前

    事实上,这个问题不是在PHP中发生的,而是在JavaScript中发生的,这是由于Word的复制/粘贴造成的,所以在将文本传递给PHP之前,您需要用JavaScript解决问题,请参见此答案 https://stackoverflow.com/a/6219023/1857295 .

    推荐文章