Issues (1474)

framework/Util/TUtf8Converter.php (2 issues)

Labels
Severity
1
<?php
2
3
/**
4
 * TUtf8Converter class file
5
 *
6
 * @author Fabio Bas <[email protected]>
7
 * @link https://github.com/pradosoft/prado
8
 * @license https://github.com/pradosoft/prado/blob/master/LICENSE
9
 */
10
11
namespace Prado\Util;
12
13
/**
14
 * TUtf8Converter class.
15
 *
16
 * TUtf8Converter is a simple wrapper around iconv functions to convert
17
 * strings from and to UTF-8.
18
 *
19
 * @author Fabio Bas <[email protected]>
20
 * @since 4.0.2
21
 */
22
class TUtf8Converter
23
{
24
	/**
25
	 * Convert strings to UTF-8 via iconv. NB, the result may not by UTF-8
26
	 * if the conversion failed.
27
	 * @param string $string string to convert to UTF-8
28
	 * @param string $from source encoding
29
	 * @param ?string $lang Language of the encoding as accepted by PHP setLocale
30
	 * @return string UTF-8 encoded string, original string if iconv failed.
31
	 * @see https://www.php.net/manual/en/function.setlocale.php
32
	 *   The $lang locale information is maintained per process, not per thread.
33
	 */
34
	public static function toUTF8($string, $from, $lang = null)
35
	{
36
		if ($from != 'UTF-8') {
37
			$locale = null;
38
			if ($lang === null) {
39
				self::parseEncodingLanguage($from, $lang);
40
			}
41
			if ($lang !== null) {
42
				$locale = setLocale(LC_CTYPE, '0');
43
				setLocale(LC_CTYPE, $lang);
44
			}
45
			$s = iconv($from, 'UTF-8', $string); //to UTF-8
46
			if ($lang !== null) {
47
				setLocale(LC_CTYPE, $locale);
0 ignored issues
show
It seems like $locale can also be of type null; however, parameter $locales of setlocale() does only seem to accept array|integer|string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

47
				setLocale(LC_CTYPE, /** @scrutinizer ignore-type */ $locale);
Loading history...
48
			}
49
			return $s !== false ? $s : $string; //it could return false
50
		}
51
		return $string;
52
	}
53
54
	/**
55
	 * Convert UTF-8 strings to a different encoding. NB. The result
56
	 * may not have been encoded if iconv fails.
57
	 * @param string $string the UTF-8 string for conversion
58
	 * @param string $to destination encoding
59
	 * @param ?string $lang Language of the encoding as accepted by PHP setLocale
60
	 * @return string encoded string.
61
	 * @see https://www.php.net/manual/en/function.setlocale.php
62
	 *   The $lang locale information is maintained per process, not per thread.
63
	 */
64
	public static function fromUTF8($string, $to, $lang = null)
65
	{
66
		if ($to != 'UTF-8') {
67
			$locale = null;
68
			if ($lang === null) {
69
				self::parseEncodingLanguage($to, $lang);
70
			}
71
			if ($lang !== null) {
72
				$locale = setLocale(LC_CTYPE, '0');
73
				setLocale(LC_CTYPE, $lang);
74
			}
75
			$s = iconv('UTF-8', $to, $string);
76
			if ($lang !== null) {
77
				setLocale(LC_CTYPE, $locale);
0 ignored issues
show
It seems like $locale can also be of type null; however, parameter $locales of setlocale() does only seem to accept array|integer|string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

77
				setLocale(LC_CTYPE, /** @scrutinizer ignore-type */ $locale);
Loading history...
78
			}
79
			return $s !== false ? $s : $string;
80
		}
81
		return $string;
82
	}
83
84
	/**
85
	 * This parses a Character Set Encoding for an appended/embedded language.
86
	 * eg "ASCII" can also be "ASCII.de" to designate German ASCII layout.
87
	 * In this example, at input $encoding is "ASCII.de" and on output $encoding
88
	 * is 'ASCII' with $lang is "de".
89
	 * @param string $encoding The character set encoding with optional period and
90
	 *   language appended.
91
	 * @param ?string &$lang The output language of the encoding.
92
	 */
93
	public static function parseEncodingLanguage(string &$encoding, &$lang)
94
	{
95
		if (strpos($encoding, '.') !== false) {
96
			$parts = explode($encoding, '.', 1);
97
			$encoding = $parts[0];
98
			$lang = $parts[1];
99
		}
100
	}
101
}
102