【问题标题】:check if the string begin with euro/pound symbol检查字符串是否以欧元/英镑符号开头
【发布时间】:2015-02-09 23:25:06
【问题描述】:

我正在尝试检查 PHP 中的字符串是否以 '€' 或 '£' 开头。

下面是代码

    $text = "€123";

    if($text[0] == "€"){
        echo "true";
    }
    else{
        echo "false";
    }

    //output false

如果只检查一个字符,它工作正常

    $symbol = "€";

    if($symbol == "€"){
        echo "true";
    }
    else{
        echo "false";
    }
    // output true

我也尝试在浏览器上打印字符串。

$text = "€123";
echo $text; //display euro symbol correctly
echo $text[0] //get a question mark 

我尝试使用substr(),但出现了同样的问题。

【问题讨论】:

  • 由于多字节字符的编码,显示为问号。

标签: php string special-characters


【解决方案1】:

诸如“€”或“£”之类的字符是多字节字符。有一篇很棒的文章可以read here。根据PHP docs,PHP 字符串是字节数组。因此,使用数组括号访问或修改字符串不是多字节安全的,只能使用单字节编码的字符串(例如 ISO-8859-1)。

还要确保您的文件使用 UTF-8 编码:您可以使用 NotePad++ 等文本编辑器进行转换。

如果我将 PHP 简化为这个,它可以工作,关键是使用 mb_substr:

<?php
  header ('Content-type: text/html; charset=utf-8');
  $text = "€123";
  echo mb_substr($text,0,1,'UTF-8');
?>

最后,最好在 head 标签中添加 UTF-8 元标签:

<meta charset="utf-8"> 

【讨论】:

  • 太好了,我对一些用欧元或英镑符号导入的收银机也有同样的问题,因此每次我必须将它显示到屏幕上时,我都有双符号和mb_substr救了我剪掉我需要的那部分绳子。谢谢!
【解决方案2】:

我建议这是最简单的解决方案。使用 htmlentities() 将符号转换为其 unicode 标识符。

htmlentities($text, ENT_QUOTES, "UTF-8");

哪个会给你&amp;pound;&amp;euro;。现在,您可以运行 switch() {case:} 语句进行检查。 (或者你的 if 语句)

$symbols = explode(";", $text);

switch($symbols[0]) {
    case "&pound":
        echo "It's Pounds";
        break;
    case "&euro":
        echo "It's Euros";
        break;
}

Working Example

【讨论】:

    【解决方案3】:

    发生这种情况是因为您使用的是多字节字符编码(可能是 UTF-8),其中 € 和 £ 都使用多个字节记录。这意味着"€" 是一个 三个 字节的字符串,而不仅仅是一个。

    当您使用$text[0] 时,您只会获得第一个字符的第一个字节,因此它与"€" 的三个字节不匹配。您需要获取前三个字节,以检查一个字符串是否以另一个字符串开头。

    这是我用来执行此操作的函数:

    function string_starts_with($string, $prefix) {
        return substr($string, 0, strlen($prefix)) == $prefix;
    }
    

    出现问号是因为"€" 的第一个字节不足以编码整个字符:错误在可用时用“�”表示,否则用“?”表示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-03
      • 2011-05-04
      • 2012-02-06
      • 2023-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多