Как я ввожу 4-байтовые символы UTF-8?

Попробуйте поместить прослушиватель щелчка на дочернем виде карты, например

<android.support.v7.widget.CardView
            android:id="@+id/cardRight"
            android:layout_width="0dp"
            android:layout_height="0dp"
            app:cardCornerRadius="10dp"
            android:elevation="4dp"
            android:layout_marginEnd="4dp"
            android:layout_marginStart="4dp"
            android:layout_marginTop="8dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="@+id/guideline"
            app:layout_constraintTop_toBottomOf="@+id/cardTop">

            <LinearLayout
                android:id="@+id/layRight"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:weightSum="6"
                android:orientation="vertical"
                android:gravity="center">

                <ImageView
                    android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_weight="3"
                    android:src="@drawable/illustration"
                    android:scaleType="centerCrop"/>

            </LinearLayout>
        </android.support.v7.widget.CardView>

, а в своей деятельности определите linearLayout и попробуйте установить onClicklistener с помощью

.
5
задан hippietrail 30 May 2013 в 02:19
поделиться

1 ответ

Существует более длинная форма Escape в шаблоне \U сопровождаемый восемью цифрами, а не \u сопровождаемый четырьмя цифрами. Это также используется в Java и Python среди других:

>>> '\xf0\x90\x84\x82'.decode("UTF-8")
u'\U00010102'

Однако, если Вы используете строки байтов, почему не только выходят из каждого байта как вышеупомянутый, вместо того, чтобы полагаться на компилятор для преобразования Escape в строку UTF-8? Это, казалось бы, было бы более портативным также - если я компилирую следующую программу:

#include <iostream>
#include <string>

int main()
{
    std::cout << "narrow: " << std::string("\uFF0E").length() <<
        " utf8: " << std::string("\xEF\xBC\x8E").length() <<
        " wide: " << std::wstring(L"\uFF0E").length() << std::endl;

    std::cout << "narrow: " << std::string("\U00010102").length() <<
        " utf8: " << std::string("\xF0\x90\x84\x82").length() <<
        " wide: " << std::wstring(L"\U00010102").length() << std::endl;
}

На win32 с моими текущими опциями статья дает:

warning C4566: character represented by universal-character-name '\UD800DD02' cannot be represented in the current code page (932)

Компилятор пытается преобразовать все Escape unicode в строках байтов к странице системного кода, которая в отличие от UTF-8 не может представить все unicode символы. Странно это поняло это \U00010102 \uD800\uDD02 в UTF-16 (его внутреннее unicode представление) и искаженный Escape в сообщении об ошибке...

Когда выполнено, печать программы:

narrow: 2 utf8: 3 wide: 1
narrow: 2 utf8: 4 wide: 2

Обратите внимание, что строки байтов UTF-8 и широкие строки корректны, но компилятору не удалось преобразовать "\U00010102", предоставление строки байтов "??", неправильный результат.

5
ответ дан 14 December 2019 в 19:30
поделиться
Другие вопросы по тегам:

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