| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 |
- <?php
- namespace App\Models\Char;
- use Illuminate\Database\Eloquent\Model;
- class CharMail extends Model
- {
- protected $connection = 'Char';
- protected $table = 'Table_CharMail';
- protected $primaryKey = 'MailDBKey';
- protected $dates = ['CreateDate', 'ReadDate'];
- protected $fillable = [
- 'RecverDBKey',
- 'Slot',
- 'Deleted',
- 'MailDBKey',
- 'SentMailDBKey',
- 'SenderDBKeyAccount',
- 'SenderDBKey',
- 'SendName',
- 'RecvName',
- 'bRead',
- 'Title',
- 'MailType',
- 'CreateDate',
- 'ReadDate',
- 'Money',
- 'AlreadyMoney',
- 'Letter',
- 'ItemCount',
- 'ItemSlot0',
- 'ItemSlot1',
- 'ItemSlot2',
- 'ItemSlot3',
- 'ItemSlot4',
- 'AlreadyItem0',
- 'AlreadyItem1',
- 'AlreadyItem2',
- 'AlreadyItem3',
- 'AlreadyItem4',
- 'AlreadyItem5',
- 'AlreadyItem6',
- 'AlreadyItem7',
- 'AlreadyItem8',
- 'AlreadyItem9',
- 'Confirm',
- 'binLetter',
- 'MailSerial',
- 'binTitle',
- ];
- public $timestamps = false;
- public function getBinLetterAttribute($value)
- {
- return $this->decodeBinaryValue($value);
- }
- public function setBinLetterAttribute($value)
- {
- $this->attributes['binLetter'] = $this->encodeBinaryValue($value);
- }
- public function getBinTitleAttribute($value)
- {
- return $this->decodeBinaryValue($value);
- }
- public function setBinTitleAttribute($value)
- {
- $this->attributes['binTitle'] = $this->encodeBinaryValue($value);
- }
- private function decodeBinaryValue(?string $value): ?string
- {
- $value = $this->stripNulls($value);
- if ($value === null || $value === '') {
- return $value;
- }
- $decoded = $this->decodeBase64($this->decodeBase64($value));
- $decoded = $this->stripNulls($decoded);
- return $decoded === null ? null : $this->ensureUtf8($decoded);
- }
- private function encodeBinaryValue(?string $value): ?string
- {
- $value = $this->stripNulls($value);
- if ($value === null || $value === '') {
- return $value;
- }
- $prepared = @iconv('UTF-8', 'CP1251//IGNORE', $value);
- if ($prepared === false) {
- $prepared = $value;
- }
- return base64_encode(base64_encode($prepared));
- }
- private function stripNulls(?string $value): ?string
- {
- return $value === null ? null : rtrim($value, "\0");
- }
- private function decodeBase64(string $value): string
- {
- $decoded = base64_decode($value, true);
- return $decoded === false ? $value : $decoded;
- }
- private function ensureUtf8(string $value): string
- {
- if ($value === '') {
- return '';
- }
- if (mb_check_encoding($value, 'UTF-8')) {
- return $this->removeControlChars($value);
- }
- $candidates = [];
- if (function_exists('iconv')) {
- $candidates[] = fn () => @iconv('CP1251', 'UTF-8//IGNORE', $value);
- }
- if (function_exists('mb_convert_encoding')) {
- $candidates[] = fn () => @mb_convert_encoding($value, 'UTF-8', 'CP1251');
- $candidates[] = fn () => @mb_convert_encoding($value, 'UTF-8', 'ISO-8859-1');
- }
- $candidates[] = fn () => utf8_encode($value);
- foreach ($candidates as $candidate) {
- $converted = $candidate();
- if (is_string($converted) && mb_check_encoding($converted, 'UTF-8')) {
- return $this->removeControlChars($converted);
- }
- }
- if (function_exists('iconv')) {
- $sanitized = @iconv('UTF-8', 'UTF-8//IGNORE', $value);
- if (is_string($sanitized) && mb_check_encoding($sanitized, 'UTF-8')) {
- return $this->removeControlChars($sanitized);
- }
- }
- return '';
- }
- private function removeControlChars(string $value): string
- {
- $clean = preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/u', '', $value);
- return is_string($clean) ? $clean : '';
- }
- public function toArray()
- {
- $array = parent::toArray();
- array_walk_recursive($array, function (&$v) {
- if (is_string($v)) {
- $v = $this->ensureUtf8($v);
- }
- });
- return $array;
- }
- }
|