Skip to content

Instantly share code, notes, and snippets.

@2no
Created August 21, 2011 06:57
Show Gist options
  • Save 2no/1160265 to your computer and use it in GitHub Desktop.
Save 2no/1160265 to your computer and use it in GitHub Desktop.
自動的に文字列を UTF-8 に変換し、NULL バイト文字を削除する
<?php
class Variables extends ArrayObject
{
/**
* 取得候補の文字コード
*
* @var string
*/
const DETECT_ORDER_ENCODING = 'UTF-8, SJIS-win, eucJP-win';
/**
* エラーが発生しているか
*
* @var boolean
*/
private $_hasError;
/**
* 変換後の文字コード
*
* @var string
*/
private $_encoding;
/**
* コンストラクタ
*
* 存在しないリクエストメソッドが指定された場合、自動的に GET が指定されます。
*
* @param mixed $value 格納した値
* @param string $encoding 文字列があった場合に適用する文字コード
* @return void
*/
public function __construct($value = null, $encoding = 'UTF-8')
{
$this->_hasError = false;
$this->_encoding = '';
$this->setEncoding($encoding);
parent::__construct($this->_mends($value));
}
/**
* 値を追加します。
*
* @param mixed $value 追加する値
* @return void
*/
public function append($value)
{
parent::append($this->_mends($value));
}
/**
* 指定したインデックスに新しい値をセットします。
*
* @param int $index 設定したいインデックス
* @param mixed $newval index の新しい値
* @return void
*/
public function offsetSet($index, $newval)
{
parent::offsetSet($index, $this->_mends($newval));
}
/**
* エラーが発生しているか
*
* @return boolean
*/
public function hasError()
{
return $this->_hasError;
}
/**
* 変換後の文字コード
*
* @return string
*/
public function getEncoding()
{
return $this->_encoding;
}
/**
* 変換後の文字コードを設定します。
*
* @param $encoding 設定した文字コード
* @return void
*/
public function setEncoding($encoding)
{
if (0 < strlen($encoding)) {
$this->_encoding = $encoding;
}
}
/**
* 値を直します。
*
* @param mixed $value 直す対象の値
* @return mixed 直した後の値
*/
private function _mends($value)
{
if (is_string($value)) {
$value = str_replace("\0", '', $value);
$toEncode = $this->_encoding;
$fromEncode = mb_detect_encoding($value,
self::DETECT_ORDER_ENCODING, true);
if (!$fromEncode) {
$this->_hasError = true;
}
else {
$value = mb_convert_encoding($value, $toEncode, $fromEncode);
}
}
else if (is_array($value)) {
$value = array_map(array($this, '_mends'), $value);
}
return $value;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment