Iconv return phpunit 中的错误字符串
Iconv return incorrect string in phpunit
我在 SF4 中有项目并使用 phpunit 6.5.8。我测试了使用 iconv 的服务:
iconv('UTF-8', 'ASCII//TRANSLIT', $string)
当我在应用程序中使用此服务并且当 $string 的值为:“ąbć”时,返回的是 "abc" 但是当在 phpunit 中运行相同的服务时返回的是“?b?”。
我不明白为什么它不起作用...当然测试是否定的,但在应用中效果很好。
好的,我解决了一个问题。 Php 在 CLI 中不设置语言环境。所以我们必须在测试前设置它。
1。检查您在系统中的位置:
locale -a
例如:
$ locale -a
C
C.UTF-8
en_US.utf8
2。在测试中添加:
setlocale(LC_CTYPE, 'en_US.utf8');
3。示例:
public static function setUpBeforeClass()
{
setlocale(LC_CTYPE, 'en_US.utf8');
}
来源:
我制作了一个 Class 来处理字符串,其中一种方法使用 iconv。
在 Windows 中使用 phpunit 时,iconv 因区域设置问题无法音译。
即使在代码上使用 setlocale(),结果总是使用下面的代码测试失败
/**
* @param $str Convert string to lowercase and replace special chars to equivalents ou remove its
* @return string
*/
public static function slugify($str)
{
$str = self::toUtf8($str); // Convert from any encoding to UTF-8
$str = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $str); // transliterate
$str = strtolower($str); // lowercase
return $str;
}
单元测试
public function testSlugfy()
{
// Basic String
$str = StringUtils::slugify($this->basicstring);
$this->assertEquals(strtolower($this->basicstring), $str, 'Basic String cannot be slugfied');
// Latin String
$str = StringUtils::slugify($this->latinstring);
$this->assertEquals(strtolower($this->basicstring), $str, 'Latin1 String cannot be slugfied');
// UTF-8 String
$str = StringUtils::slugify($str);
$this->assertEquals(strtolower($this->basicstring), $str, 'UTF8 String cannot be slugfied');
}
我的应用程序没有任何问题,但 PHPUnit 测试因上述代码而失败。
所以,为了通过测试,我将函数更改为
/**
* @param $str Convert string to lowercase and replace special chars to equivalents ou remove its
* @return string
*/
public static function slugify($str)
{
$string = self::toUtf8($str);
$string = iconv('UTF-8', 'ASCII//TRANSLIT', $string);
if ($string != htmlentities($str, ENT_QUOTES, 'UTF-8')) { // iconv fails
$string = htmlentities($str, ENT_QUOTES, 'UTF-8');
$string = preg_replace('#&([a-z]{1,2})(acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);#i', '', $string);
// If need to leave only 0-9, a-z and A-Z
// $string = html_entity_decode($string, ENT_QUOTES, 'UTF-8');
// $string = preg_replace(array('#[^0-9a-z]#i', '#[ -]+#'), ' ', $string);
$string = trim($string, ' -');
}
// lowercase
$str = strtolower($string);
return $str;
}
并且在单元测试 class 构造函数中,我使用另一种方法创建字符串,以避免文件字符集和区域设置问题的麻烦。
private $basicstring;
private $latinstring;
private $utf8string;
public function __construct()
{
// ASCII string
$this->basicstring = 'aeioucAEIOUC';
// To avoid troubles using command line in different locales
// the string used to create different charset is a plain HTML entities
// Using html_entity_decode to convert the
// string ãéìôüçÃÉìÔÜÇ
// into ãéìôüçÃÉìÔÜÇ in different charsets
$html_chars = 'ãéìôüçÃÉìÔÜÇ';
$this->utf8string = html_entity_decode($html_chars, ENT_HTML5, 'UTF-8');
$this->latinstring = html_entity_decode($html_chars, ENT_HTML5, 'ISO-8859-1');
parent::__construct();
}
我也在使用 Symfony 4
我在 SF4 中有项目并使用 phpunit 6.5.8。我测试了使用 iconv 的服务:
iconv('UTF-8', 'ASCII//TRANSLIT', $string)
当我在应用程序中使用此服务并且当 $string 的值为:“ąbć”时,返回的是 "abc" 但是当在 phpunit 中运行相同的服务时返回的是“?b?”。
我不明白为什么它不起作用...当然测试是否定的,但在应用中效果很好。
好的,我解决了一个问题。 Php 在 CLI 中不设置语言环境。所以我们必须在测试前设置它。
1。检查您在系统中的位置:
locale -a
例如:
$ locale -a
C
C.UTF-8
en_US.utf8
2。在测试中添加:
setlocale(LC_CTYPE, 'en_US.utf8');
3。示例:
public static function setUpBeforeClass()
{
setlocale(LC_CTYPE, 'en_US.utf8');
}
来源:
我制作了一个 Class 来处理字符串,其中一种方法使用 iconv。
在 Windows 中使用 phpunit 时,iconv 因区域设置问题无法音译。 即使在代码上使用 setlocale(),结果总是使用下面的代码测试失败
/**
* @param $str Convert string to lowercase and replace special chars to equivalents ou remove its
* @return string
*/
public static function slugify($str)
{
$str = self::toUtf8($str); // Convert from any encoding to UTF-8
$str = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $str); // transliterate
$str = strtolower($str); // lowercase
return $str;
}
单元测试
public function testSlugfy()
{
// Basic String
$str = StringUtils::slugify($this->basicstring);
$this->assertEquals(strtolower($this->basicstring), $str, 'Basic String cannot be slugfied');
// Latin String
$str = StringUtils::slugify($this->latinstring);
$this->assertEquals(strtolower($this->basicstring), $str, 'Latin1 String cannot be slugfied');
// UTF-8 String
$str = StringUtils::slugify($str);
$this->assertEquals(strtolower($this->basicstring), $str, 'UTF8 String cannot be slugfied');
}
我的应用程序没有任何问题,但 PHPUnit 测试因上述代码而失败。
所以,为了通过测试,我将函数更改为
/**
* @param $str Convert string to lowercase and replace special chars to equivalents ou remove its
* @return string
*/
public static function slugify($str)
{
$string = self::toUtf8($str);
$string = iconv('UTF-8', 'ASCII//TRANSLIT', $string);
if ($string != htmlentities($str, ENT_QUOTES, 'UTF-8')) { // iconv fails
$string = htmlentities($str, ENT_QUOTES, 'UTF-8');
$string = preg_replace('#&([a-z]{1,2})(acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);#i', '', $string);
// If need to leave only 0-9, a-z and A-Z
// $string = html_entity_decode($string, ENT_QUOTES, 'UTF-8');
// $string = preg_replace(array('#[^0-9a-z]#i', '#[ -]+#'), ' ', $string);
$string = trim($string, ' -');
}
// lowercase
$str = strtolower($string);
return $str;
}
并且在单元测试 class 构造函数中,我使用另一种方法创建字符串,以避免文件字符集和区域设置问题的麻烦。
private $basicstring;
private $latinstring;
private $utf8string;
public function __construct()
{
// ASCII string
$this->basicstring = 'aeioucAEIOUC';
// To avoid troubles using command line in different locales
// the string used to create different charset is a plain HTML entities
// Using html_entity_decode to convert the
// string ãéìôüçÃÉìÔÜÇ
// into ãéìôüçÃÉìÔÜÇ in different charsets
$html_chars = 'ãéìôüçÃÉìÔÜÇ';
$this->utf8string = html_entity_decode($html_chars, ENT_HTML5, 'UTF-8');
$this->latinstring = html_entity_decode($html_chars, ENT_HTML5, 'ISO-8859-1');
parent::__construct();
}
我也在使用 Symfony 4