build/controllers/Utf8Controller.php
public function actionCheckGuide($directory = null)
    {
        if ($directory === null) {
            $directory = \dirname(\dirname(__DIR__)) . '/docs';
        }
        if (is_file($directory)) {
            $files = [$directory];
        } else {
            $files = FileHelper::findFiles($directory, [
                'only' => ['*.md'],
            ]);
        }

        foreach ($files as $file) {
            $content = file_get_contents($file);
            $chars = preg_split('//u', $content, null, PREG_SPLIT_NO_EMPTY);

            $line = 1;
            $pos = 0;
            foreach ($chars as $c) {
                $ord = $this->unicodeOrd($c);

                $pos++;
                if ($ord == 0x000A) {
                    $line++;
                    $pos = 0;
                }

                if ($ord === false) {
                    $this->found('BROKEN UTF8', $c, $line, $pos, $file);
                    continue;
                }

                // http://unicode-table.com/en/blocks/general-punctuation/
                if (0x2000 <= $ord && $ord <= 0x200F
                 || 0x2028 <= $ord && $ord <= 0x202E
                 || 0x205f <= $ord && $ord <= 0x206F
                    ) {
                    $this->found('UNSUPPORTED SPACE CHARACTER', $c, $line, $pos, $file);
                    continue;
                }
                if ($ord < 0x0020 && $ord != 0x000A && $ord != 0x0009 ||
                    0x0080 <= $ord && $ord < 0x009F) {
                    $this->found('CONTROL CHARARCTER', $c, $line, $pos, $file);
                    continue;
                }
//                if ($ord > 0x009F) {
//                    $this->found("NON ASCII CHARARCTER", $c, $line, $pos, $file);
//                    continue;
//                }
            }
        }
    }
public function actionCheckGuide($directory = null)
    {
        if ($directory === null) {
            $directory = \dirname(\dirname(__DIR__)) . '/docs';
        }
        if (is_file($directory)) {
            $files = [$directory];
        } else {
            $files = FileHelper::findFiles($directory, [
                'only' => ['*.md'],
            ]);
        }

        foreach ($files as $file) {
            $content = file_get_contents($file);
            $chars = preg_split('//u', $content, null, PREG_SPLIT_NO_EMPTY);

            $line = 1;
            $pos = 0;
            foreach ($chars as $c) {
                $ord = $this->unicodeOrd($c);

                $pos++;
                if ($ord == 0x000A) {
                    $line++;
                    $pos = 0;
                }

                if ($ord === false) {
                    $this->found('BROKEN UTF8', $c, $line, $pos, $file);
                    continue;
                }

                // http://unicode-table.com/en/blocks/general-punctuation/
                if (0x2000 <= $ord && $ord <= 0x200F
                 || 0x2028 <= $ord && $ord <= 0x202E
                 || 0x205f <= $ord && $ord <= 0x206F
                    ) {
                    $this->found('UNSUPPORTED SPACE CHARACTER', $c, $line, $pos, $file);
                    continue;
                }
                if ($ord < 0x0020 && $ord != 0x000A && $ord != 0x0009 ||
                    0x0080 <= $ord && $ord < 0x009F) {
                    $this->found('CONTROL CHARARCTER', $c, $line, $pos, $file);
                    continue;
                }
//                if ($ord > 0x009F) {
//                    $this->found("NON ASCII CHARARCTER", $c, $line, $pos, $file);
//                    continue;
//                }
            }
        }
    }
Check guide for non-printable characters that may break docs generation.

@param string $directory the directory to check. If not specified, the default
guide directory will be checked.