67 lines
2.0 KiB
PHP
67 lines
2.0 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace MonetaPhpShop\host;
|
|
|
|
/**
|
|
* Êîäèðîâêè íà ãðàíèöå ñ PHPShop.
|
|
*
|
|
* Ìîäóëü âíóòðè ðàáîòàåò â cp1251 — â íåé åãî èñõîäíèêè ïîñëå ñáîðêè è øòàòíàÿ áàçà PHPShop.
|
|
* Ìàãàçèí ñ áàçîé `utf-8` (`$PHPShopBase->codBase`) îòäà¸ò ñòðîêè èç ÁÄ â UTF-8 è âûâîäèò
|
|
* ñòðàíèöû â UTF-8 — íà ýòîé ãðàíèöå ñòðîêè ïåðåêîäèðóþòñÿ, êàê â øòàòíûõ ìîäóëÿõ ÿäðà.
|
|
* Âñ¸, ÷òî óõîäèò â Ìîíåòó (JSON, XML), — UTF-8.
|
|
*/
|
|
final class HostCharset
|
|
{
|
|
private function __construct() {}
|
|
|
|
public static function isUtf8Shop(): bool
|
|
{
|
|
$base = $GLOBALS['PHPShopBase'] ?? null;
|
|
|
|
return is_object($base) && isset($base->codBase) && ($base->codBase === 'utf-8');
|
|
}
|
|
|
|
/**
|
|
* Ñòðîêà èç ÁÄ ìàãàçèíà -> cp1251.
|
|
*/
|
|
public static function fromDatabase(string $value): string
|
|
{
|
|
if (!self::isUtf8Shop()) {
|
|
return $value;
|
|
}
|
|
$converted = iconv('UTF-8', 'Windows-1251//IGNORE', $value);
|
|
|
|
return ($converted === false) ? '' : $converted;
|
|
}
|
|
|
|
/**
|
|
* Ñòðîêà ìîäóëÿ (cp1251) -> êîäèðîâêà ÁÄ ìàãàçèíà.
|
|
*/
|
|
public static function toDatabase(string $value): string
|
|
{
|
|
return self::isUtf8Shop() ? self::toUtf8($value) : $value;
|
|
}
|
|
|
|
/**
|
|
* HTML ìîäóëÿ (cp1251) -> êîäèðîâêà ñòðàíèöû ìàãàçèíà.
|
|
*/
|
|
public static function toPage(string $html): string
|
|
{
|
|
return self::isUtf8Shop() ? self::toUtf8($html) : $html;
|
|
}
|
|
|
|
/**
|
|
* cp1251 -> UTF-8 äëÿ Ìîíåòû. Áàéò 0x98 â cp1251 íå îïðåäåë¸í — íà í¸ì iconv âåðíóë áû false
|
|
* íà âñþ ñòðîêó (íàçâàíèå ïîçèöèè â ÷åêå ñòàëî áû ïóñòûì), ïîýòîìó îí óäàëÿåòñÿ çàðàíåå.
|
|
* Íå //IGNORE: åãî ïîääåðæêà çàâèñèò îò ðåàëèçàöèè iconv (glibc — äà, musl — íåò).
|
|
*/
|
|
public static function toUtf8(string $value): string
|
|
{
|
|
$converted = iconv('Windows-1251', 'UTF-8', str_replace("\x98", '', $value));
|
|
|
|
return ($converted === false) ? '' : $converted;
|
|
}
|
|
}
|