public function writeUrlInternal($row1, $col1, $row2, $col2, $url)
    {
        $record = 0x01B8; // Record identifier
        $length = 0x00000; // Bytes to follow

        // Strip URL type
        $url = preg_replace('/^internal:/', '', $url);

        // Pack the undocumented parts of the hyperlink stream
        $unknown1 = pack('H*', 'D0C9EA79F9BACE118C8200AA004BA90B02000000');

        // Pack the option flags
        $options = pack('V', 0x08);

        // Convert the URL type and to a null terminated wchar string
        $url .= "\0";

        // character count
        $url_len = StringHelper::countCharacters($url);
        $url_len = pack('V', $url_len);

        $url = StringHelper::convertEncoding($url, 'UTF-16LE', 'UTF-8');

        // Calculate the data length
        $length = 0x24 + strlen($url);

        // Pack the header data
        $header = pack('vv', $record, $length);
        $data = pack('vvvv', $row1, $row2, $col1, $col2);

        // Write the packed data
        $this->append($header . $data . $unknown1 . $options . $url_len . $url);

        return 0;
    }