159 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			159 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			PHP
		
	
	
| 
								 | 
							
								<?php
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace Zxing\Common;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Encapsulates a Character Set ECI, according to "Extended Channel
							 | 
						||
| 
								 | 
							
								 * Interpretations" 5.3.1.1 of ISO 18004.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								final class CharacterSetECI
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    /**#@+
							 | 
						||
| 
								 | 
							
								     * Character set constants.
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    const CP437                = 0;
							 | 
						||
| 
								 | 
							
								    const ISO8859_1            = 1;
							 | 
						||
| 
								 | 
							
								    const ISO8859_2            = 4;
							 | 
						||
| 
								 | 
							
								    const ISO8859_3            = 5;
							 | 
						||
| 
								 | 
							
								    const ISO8859_4            = 6;
							 | 
						||
| 
								 | 
							
								    const ISO8859_5            = 7;
							 | 
						||
| 
								 | 
							
								    const ISO8859_6            = 8;
							 | 
						||
| 
								 | 
							
								    const ISO8859_7            = 9;
							 | 
						||
| 
								 | 
							
								    const ISO8859_8            = 10;
							 | 
						||
| 
								 | 
							
								    const ISO8859_9            = 11;
							 | 
						||
| 
								 | 
							
								    const ISO8859_10           = 12;
							 | 
						||
| 
								 | 
							
								    const ISO8859_11           = 13;
							 | 
						||
| 
								 | 
							
								    const ISO8859_12           = 14;
							 | 
						||
| 
								 | 
							
								    const ISO8859_13           = 15;
							 | 
						||
| 
								 | 
							
								    const ISO8859_14           = 16;
							 | 
						||
| 
								 | 
							
								    const ISO8859_15           = 17;
							 | 
						||
| 
								 | 
							
								    const ISO8859_16           = 18;
							 | 
						||
| 
								 | 
							
								    const SJIS                 = 20;
							 | 
						||
| 
								 | 
							
								    const CP1250               = 21;
							 | 
						||
| 
								 | 
							
								    const CP1251               = 22;
							 | 
						||
| 
								 | 
							
								    const CP1252               = 23;
							 | 
						||
| 
								 | 
							
								    const CP1256               = 24;
							 | 
						||
| 
								 | 
							
								    const UNICODE_BIG_UNMARKED = 25;
							 | 
						||
| 
								 | 
							
								    const UTF8                 = 26;
							 | 
						||
| 
								 | 
							
								    const ASCII                = 27;
							 | 
						||
| 
								 | 
							
								    const BIG5                 = 28;
							 | 
						||
| 
								 | 
							
								    const GB18030              = 29;
							 | 
						||
| 
								 | 
							
								    const EUC_KR               = 30;
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * Map between character names and their ECI values.
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @var array
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    protected static $nameToEci = [
							 | 
						||
| 
								 | 
							
								        'ISO-8859-1'   => self::ISO8859_1,
							 | 
						||
| 
								 | 
							
								        'ISO-8859-2'   => self::ISO8859_2,
							 | 
						||
| 
								 | 
							
								        'ISO-8859-3'   => self::ISO8859_3,
							 | 
						||
| 
								 | 
							
								        'ISO-8859-4'   => self::ISO8859_4,
							 | 
						||
| 
								 | 
							
								        'ISO-8859-5'   => self::ISO8859_5,
							 | 
						||
| 
								 | 
							
								        'ISO-8859-6'   => self::ISO8859_6,
							 | 
						||
| 
								 | 
							
								        'ISO-8859-7'   => self::ISO8859_7,
							 | 
						||
| 
								 | 
							
								        'ISO-8859-8'   => self::ISO8859_8,
							 | 
						||
| 
								 | 
							
								        'ISO-8859-9'   => self::ISO8859_9,
							 | 
						||
| 
								 | 
							
								        'ISO-8859-10'  => self::ISO8859_10,
							 | 
						||
| 
								 | 
							
								        'ISO-8859-11'  => self::ISO8859_11,
							 | 
						||
| 
								 | 
							
								        'ISO-8859-12'  => self::ISO8859_12,
							 | 
						||
| 
								 | 
							
								        'ISO-8859-13'  => self::ISO8859_13,
							 | 
						||
| 
								 | 
							
								        'ISO-8859-14'  => self::ISO8859_14,
							 | 
						||
| 
								 | 
							
								        'ISO-8859-15'  => self::ISO8859_15,
							 | 
						||
| 
								 | 
							
								        'ISO-8859-16'  => self::ISO8859_16,
							 | 
						||
| 
								 | 
							
								        'SHIFT-JIS'    => self::SJIS,
							 | 
						||
| 
								 | 
							
								        'WINDOWS-1250' => self::CP1250,
							 | 
						||
| 
								 | 
							
								        'WINDOWS-1251' => self::CP1251,
							 | 
						||
| 
								 | 
							
								        'WINDOWS-1252' => self::CP1252,
							 | 
						||
| 
								 | 
							
								        'WINDOWS-1256' => self::CP1256,
							 | 
						||
| 
								 | 
							
								        'UTF-16BE'     => self::UNICODE_BIG_UNMARKED,
							 | 
						||
| 
								 | 
							
								        'UTF-8'        => self::UTF8,
							 | 
						||
| 
								 | 
							
								        'ASCII'        => self::ASCII,
							 | 
						||
| 
								 | 
							
								        'GBK'          => self::GB18030,
							 | 
						||
| 
								 | 
							
								        'EUC-KR'       => self::EUC_KR,
							 | 
						||
| 
								 | 
							
								    ];
							 | 
						||
| 
								 | 
							
								    /**#@-*/
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * Additional possible values for character sets.
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @var array
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    protected static $additionalValues = [
							 | 
						||
| 
								 | 
							
								        self::CP437 => 2,
							 | 
						||
| 
								 | 
							
								        self::ASCII => 170,
							 | 
						||
| 
								 | 
							
								    ];
							 | 
						||
| 
								 | 
							
								    private static $name = null;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * Gets character set ECI by value.
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @param  string $name
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @return CharacterSetEci|null
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public static function getCharacterSetECIByValue($value)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if ($value < 0 || $value >= 900) {
							 | 
						||
| 
								 | 
							
								            throw new \InvalidArgumentException('Value must be between 0 and 900');
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        if (false !== ($key = array_search($value, self::$additionalValues))) {
							 | 
						||
| 
								 | 
							
								            $value = $key;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        array_search($value, self::$nameToEci);
							 | 
						||
| 
								 | 
							
								        try {
							 | 
						||
| 
								 | 
							
								            self::setName($value);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            return new self($value);
							 | 
						||
| 
								 | 
							
								        } catch (\UnexpectedValueException $e) {
							 | 
						||
| 
								 | 
							
								            return null;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    private static function setName($value)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        foreach (self::$nameToEci as $name => $key) {
							 | 
						||
| 
								 | 
							
								            if ($key == $value) {
							 | 
						||
| 
								 | 
							
								                self::$name = $name;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                return true;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        if (self::$name == null) {
							 | 
						||
| 
								 | 
							
								            foreach (self::$additionalValues as $name => $key) {
							 | 
						||
| 
								 | 
							
								                if ($key == $value) {
							 | 
						||
| 
								 | 
							
								                    self::$name = $name;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                    return true;
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * Gets character set ECI name.
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @return character set ECI name|null
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public static function name()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return self::$name;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * Gets character set ECI by name.
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @param  string $name
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @return CharacterSetEci|null
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public static function getCharacterSetECIByName($name)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $name = strtoupper($name);
							 | 
						||
| 
								 | 
							
								        if (isset(self::$nameToEci[$name])) {
							 | 
						||
| 
								 | 
							
								            return new self(self::$nameToEci[$name]);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        return null;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |