Задать вопрос
proudmore
@proudmore

Почему basename в ru_RU locale обрезает имена файлов?

public function files()
    {
        return [
            ['Act.txt', 'Act.txt'],
            ['Акт.txt', 'Акт.txt']
        ];
    }

    /**
     * @dataProvider files
     * @param $source
     * @param $expected
     */
    public function testCorrect($source, $expected)
    {
        setlocale(LC_ALL, 'ru_RU.UTF-8');
        $this->tester->assertEquals($expected, basename($this->mockFile($source)));
    }

    private function mockFile(string $name): string
    {
        $path = sys_get_temp_dir() . '/' . $name;
        file_put_contents($path, 'test');

        return $path;
    }


Failed asserting that two strings are equal.
Expected :'Акт.txt'
Actual   :'.txt'


UPD. setlocale возвращает false, т.е. не устанавливается. текущая локаль: C.

Вопрос в следующем, тогда: почему setlocale не устанавливает локаль?
Пошел в документацию и справочники, перепробовал все варианты, результат тот же

UPD2.

root@7e073872b716:/app# locale -a
C
C.UTF-8
POSIX
root@7e073872b716:/app#


В системе нет нужной локали, поэтому не устанавливается.
На этом вопрос можно закрывать.
  • Вопрос задан
  • 176 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
proudmore
@proudmore Автор вопроса
Текущая локаль: C

В таком варианте тесты проходят
public function testCorrect($source, $expected)
    {
        $locale = 'C.UTF-8';
        expect(setlocale(LC_ALL, $locale))->equals($locale);
        $this->tester->assertEquals($expected, basename($this->mockFile($source)));
    }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы