CharacterSetEci.php 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. <?php
  2. namespace Zxing\Common;
  3. use Zxing\Common\AbstractEnum;
  4. /**
  5. * Encapsulates a Character Set ECI, according to "Extended Channel
  6. * Interpretations" 5.3.1.1 of ISO 18004.
  7. */
  8. final class CharacterSetECI
  9. {
  10. private static $name = null;
  11. /**#@+
  12. * Character set constants.
  13. */
  14. const CP437 = 0;
  15. const ISO8859_1 = 1;
  16. const ISO8859_2 = 4;
  17. const ISO8859_3 = 5;
  18. const ISO8859_4 = 6;
  19. const ISO8859_5 = 7;
  20. const ISO8859_6 = 8;
  21. const ISO8859_7 = 9;
  22. const ISO8859_8 = 10;
  23. const ISO8859_9 = 11;
  24. const ISO8859_10 = 12;
  25. const ISO8859_11 = 13;
  26. const ISO8859_12 = 14;
  27. const ISO8859_13 = 15;
  28. const ISO8859_14 = 16;
  29. const ISO8859_15 = 17;
  30. const ISO8859_16 = 18;
  31. const SJIS = 20;
  32. const CP1250 = 21;
  33. const CP1251 = 22;
  34. const CP1252 = 23;
  35. const CP1256 = 24;
  36. const UNICODE_BIG_UNMARKED = 25;
  37. const UTF8 = 26;
  38. const ASCII = 27;
  39. const BIG5 = 28;
  40. const GB18030 = 29;
  41. const EUC_KR = 30;
  42. /**#@-*/
  43. /**
  44. * Map between character names and their ECI values.
  45. *
  46. * @var array
  47. */
  48. protected static $nameToEci = array(
  49. 'ISO-8859-1' => self::ISO8859_1,
  50. 'ISO-8859-2' => self::ISO8859_2,
  51. 'ISO-8859-3' => self::ISO8859_3,
  52. 'ISO-8859-4' => self::ISO8859_4,
  53. 'ISO-8859-5' => self::ISO8859_5,
  54. 'ISO-8859-6' => self::ISO8859_6,
  55. 'ISO-8859-7' => self::ISO8859_7,
  56. 'ISO-8859-8' => self::ISO8859_8,
  57. 'ISO-8859-9' => self::ISO8859_9,
  58. 'ISO-8859-10' => self::ISO8859_10,
  59. 'ISO-8859-11' => self::ISO8859_11,
  60. 'ISO-8859-12' => self::ISO8859_12,
  61. 'ISO-8859-13' => self::ISO8859_13,
  62. 'ISO-8859-14' => self::ISO8859_14,
  63. 'ISO-8859-15' => self::ISO8859_15,
  64. 'ISO-8859-16' => self::ISO8859_16,
  65. 'SHIFT-JIS' => self::SJIS,
  66. 'WINDOWS-1250' => self::CP1250,
  67. 'WINDOWS-1251' => self::CP1251,
  68. 'WINDOWS-1252' => self::CP1252,
  69. 'WINDOWS-1256' => self::CP1256,
  70. 'UTF-16BE' => self::UNICODE_BIG_UNMARKED,
  71. 'UTF-8' => self::UTF8,
  72. 'ASCII' => self::ASCII,
  73. 'GBK' => self::GB18030,
  74. 'EUC-KR' => self::EUC_KR,
  75. );
  76. /**
  77. * Additional possible values for character sets.
  78. *
  79. * @var array
  80. */
  81. protected static $additionalValues = array(
  82. self::CP437 => 2,
  83. self::ASCII => 170,
  84. );
  85. /**
  86. * Gets character set ECI by value.
  87. *
  88. * @param string $name
  89. * @return CharacterSetEci|null
  90. */
  91. public static function getCharacterSetECIByValue($value)
  92. {
  93. if ($value < 0 || $value >= 900) {
  94. throw new Exception\InvalidArgumentException('Value must be between 0 and 900');
  95. }
  96. if (false !== ($key = array_search($value, self::$additionalValues))) {
  97. $value = $key;
  98. }
  99. array_search($value, self::$nameToEci);
  100. try
  101. {
  102. self::setName($value);
  103. return new self($value);
  104. } catch (Exception\UnexpectedValueException $e) {
  105. return null;
  106. }
  107. }
  108. private static function setName($value)
  109. {
  110. foreach (self::$nameToEci as $name => $key) {
  111. if($key == $value)
  112. {
  113. self::$name = $name;
  114. return true;
  115. }
  116. }
  117. if(self::$name == null)
  118. {
  119. foreach (self::$additionalValues as $name => $key) {
  120. if($key == $value)
  121. {
  122. self::$name = $name;
  123. return true;
  124. }
  125. }
  126. }
  127. }
  128. /**
  129. * Gets character set ECI name.
  130. *
  131. * @return character set ECI name|null
  132. */
  133. public static function name()
  134. {
  135. return self::$name;
  136. }
  137. /**
  138. * Gets character set ECI by name.
  139. *
  140. * @param string $name
  141. * @return CharacterSetEci|null
  142. */
  143. public static function getCharacterSetECIByName($name)
  144. {
  145. $name = strtoupper($name);
  146. if (isset(self::$nameToEci[$name])) {
  147. return new self(self::$nameToEci[$name]);
  148. }
  149. return null;
  150. }
  151. }