如何在PHP字符串中替换表意空间?

时间:2015-12-15 02:41:09

标签: php

表意空间为http://www.charbase.com/3000-unicode-ideographic-space,它是一个CJK标点符号。它看起来像一个普通的空间,但它实际上在屏幕上占据2个位置而不是1个(就像汉字一样)

我尝试使用str_replace(" ","",$mystring)来摆脱它们,但当然它不起作用,因为我在这里输入的空间是一个ASCII空间。我也尝试使用汉字输入法手动输入表意空间,但看起来这样我也可以摆脱其他部分字符'代码,它返回乱码。

那我怎么能摆脱这些空间?

3 个答案:

答案 0 :(得分:2)

我可以通过复制您链接到的信息页面中的符号来更换字符。您可能希望为表意空间创建CONST别名,以帮助更清晰地查找/替换编码。

// contains ideographic space between words
$start = 'before after';                    

// contains ideographic space in needle parameter
$test1 = str_replace(' ', '_', $start);     

// contains ideographic space
define('ID_SPACE', ' ');                    
$test2 = str_replace(ID_SPACE, '&', $start);

// contains normal space in needle parameter
$test3 = str_replace(' ','_',$start);       

// make sure we are using utf8 for this test
header('Content-Type: text/html; charset=utf-8');

echo $start.'<br/>';
echo $test1.'<br/>';
echo $test2.'<br/>';
echo $test3;

输出:

before after
before_after
before&after
before after

编辑以回答问题

虽然您看不到它,但正在显示的框中显示该字符,只需单击并拖动即可选择任何其他文本,然后您可以根据需要粘贴它。您也可以从我的答案中复制包含空格的代码。如果您看到 之类的内容,则需要将您的字符集设置为utf-8

enter image description here

答案 1 :(得分:0)

您可以直接从转义的数值转换内容。我已经坐了很多年以下的功能。我没有写它,我担心我不记得我发现它的位置。这有点像黑客,但我认为这是一个非常有用的。

<?php

function code2utf($num) {
  if($num<128)return chr($num);
  if($num<2048)return chr(($num>>6)+192).chr(($num&63)+128);
  if($num<65536)return chr(($num>>12)+224).chr((($num>>6)&63)+128).chr(($num&63)+128);
  if($num<2097152)return chr(($num>>18)+240).chr((($num>>12)&63)+128).chr((($num>>6)&63)+128).chr(($num&63)+128);
  return '';
}

print "a" . code2utf(0x3000) . "b" . code2utf(0x1f44d) . "\n";

当我跑这个时,我看到了:

$ php -f utftest
a b

请注意,看起来像两个空格的是一个双宽字符。

也许您可以使用上面的函数来构造输入字符串,如下所示:

str_replace(code2utf(0x3000),"",$mystring);

像这样的解决方案相比WebChemist的复制和粘贴解决方案的明显优势在于它完全是程序化的,并且不需要任何特殊功能作为程序员工具的一部分。在重新格式化代码时,您不会意外覆盖ID_SPACE字符,并且该函数可以重用于您可能需要表示的其他UTF8字符,而无需在代码中实际包含这些字符。

当然,另一种方法是使用内置的PHP函数html_entity_decode()。下面的结果与我的函数相同,使用HTML转义字符作为输入:

$ php -r 'print html_entity_decode("a&#x3000;b&#x1f44d;") . "\n";'
a b

答案 2 :(得分:0)

一种对我有用的方法,将其原始编码为HTML实体&amp; str_replace回到正常的空白区域。

//The space we're looking out for
$ideoSpace      = "%26%23x3000%3B";
$space          = "%20";

//Search string (Notice the wider space)
$searchstr = "Please find me a Oil Filter";

//Begin conversion
$searchstr = rawurldecode( str_replace( $ideoSpace, $space, rawurlencode( $searchstr )));

//echos "Please find me a Oil Filter"

也许不是最优雅的解决方案。但遗憾的是,搜索不适合我们,因为implode()无法为日本客户分割字符串。