C++でのUTF-8検証
データを表す整数のリストがあるとします。有効なUTF-8エンコーディングであるかどうかを確認する必要があります。 1つのUTF-8文字の長さは1〜4バイトです。いくつかのプロパティがあります-
-
1バイト文字の場合、最初のビットは0で、その後にUnicodeコードが続きます。
-
nバイト文字の場合、最初のnビットはすべて1で、n + 1ビットは0で、その後にn-1バイトが続き、最上位2ビットは10です。
したがって、エンコード手法は次のようになります-
| 文字番号の範囲 | UTF-8オクテットシーケンス |
| 0000 0000 0000 007F | 0xxxxxxx |
| 0000 0080 0000 07FF | 110xxxxx 10xxxxxx |
| 0000 0800 0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx |
| 0001 0000 0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
したがって、入力が[197、130、1]の場合、これはオクテットシーケンス11000101 10000010 00000001を表すため、これはtrueを返します。これは、2バイト文字の後に1バイト文字が続く場合の有効なutf-8エンコーディングです。
これを解決するには、次の手順に従います-
-
cnt:=0
-
0からデータ配列のサイズまでの範囲のiの場合
-
x:=data [i]
-
cntが0の場合、
-
x / 32 =110の場合、cntを1に設定します
-
それ以外の場合、x / 16 =1110の場合、cnt =2
-
それ以外の場合、x / 8 =11110の場合、cnt =3
-
それ以外の場合、x / 128が0の場合、falseを返します
-
-
それ以外の場合、x / 64が10でない場合は、falseを返し、cntを1減らします
-
-
cntが0の場合はtrueを返します
例(C ++)
理解を深めるために、次の実装を見てみましょう-
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
bool validUtf8(vector<int>& data) {
int cnt = 0;
for(int i = 0; i <data.size(); i++){
int x = data[i];
if(!cnt){
if((x >> 5) == 0b110){
cnt = 1;
}
else if((x >> 4) == 0b1110){
cnt = 2;
}
else if((x >> 3) == 0b11110){
cnt = 3;
}
else if((x >> 7) != 0) return false;
} else {
if((x >> 6) != 0b10) return false;
cnt--;
}
}
return cnt == 0;
}
};
main(){
Solution ob;
vector<int> v = {197,130,1};
cout << (ob.validUtf8(v));
} 入力
[197,130,1]
出力
1
-
LinuxでのC++の最高のIDEは何ですか?
大きなプロジェクトは、単なるテキストエディタでは管理が困難です。このような場合にIDEを使用すると、生産性が向上し、フラストレーションが軽減される可能性があります。 IDEにはさまざまな種類があり、ニーズに合ったものを選択する必要があります。 Linux上のC++に最適なIDEは1つではありません。ツールは賢く選ぶ必要があります。 Linux用の人気のあるIMOの最高のIDEのリストは次のとおりです。 C /C++開発用のNetbeans- Netbeansは、C /C++および他の多くのプログラミング言語向けの無料のオープンソースで人気のあるクロスプラットフォームIDEです。コミュニテ
-
Linux上のc++のトップIDEは何ですか?
大きなプロジェクトは、単なるテキストエディタでは管理が困難です。このような場合にIDEを使用すると、生産性が向上し、フラストレーションが軽減される可能性があります。 IDEにはさまざまな種類があり、ニーズに合ったものを選択する必要があります。 Linuxに最適なC/C++IDEのリストは次のとおりです。 C /C++開発用のNetbeans- Netbeansは、C /C++および他の多くのプログラミング言語向けの無料のオープンソースで人気のあるクロスプラットフォームIDEです。コミュニティで開発されたプラグインを使用して完全に拡張可能です。 Eclipse CDT(C / C ++