هل يحافظ جافا على التولورال () على طول السلسلة الأصلي؟

StackOverflow https://stackoverflow.com/questions/2357315

  •  23-09-2019
  •  | 
  •  

سؤال

افترض اثنين من كائنات سلسلة Java:

String str = "<my string>";
String strLower = str.toLowerCase();

هل صحيح أن ذلك لكل قيمة <my string> التعبير

str.length() == strLower.length()

يقيم true?

هكذا ، يفعل String.toLowerCase() الحفاظ على طول السلسلة الأصلي لأي قيمة للسلسلة؟

هل كانت مفيدة؟

المحلول

من المثير للدهشة ذلك ليس!!

من مستندات جافا tolowercase

يحول جميع الأحرف في هذه السلسلة إلى خفض الحالة باستخدام قواعد اللغة المحددة. يعتمد تعيين الحالة على الإصدار القياسي Unicode المحدد بواسطة فئة الأحرف. نظرًا لأن تعيينات الحالة ليست دائمًا تعيينات char 1: 1 ، فقد تكون السلسلة الناتجة طولًا مختلفًا عن السلسلة الأصلية.

مثال:

package com.stackoverflow.q2357315;

import java.util.Locale;

public class Test {
    public static void main(String[] args) throws Exception {
        Locale.setDefault(new Locale("lt"));
        String s = "\u00cc";
        System.out.println(s + " (" + s.length() + ")"); // Ì (1)
        s = s.toLowerCase();
        System.out.println(s + " (" + s.length() + ")"); // i̇̀ (3)
    }
}

نصائح أخرى

بادئ ذي بدء ، أود أن أشير إلى أنني أتفق تمامًا مع إجابة (أعلى تصنيف حاليًا) لـ @CodadDict.

لكنني أردت إجراء تجربة ، لذلك هنا:

إنه ليس دليلًا رسميًا ، لكن هذا الرمز كان لي دون الوصول إلى داخل if (باستخدام JDK 1.6.0 Update 16 على Ubuntu):

تعديل: إليك بعض التعليمات البرمجية المحدثة التي تتولى اللغات أيضًا:

import java.util.Locale;

public class ToLowerTester {
    public final Locale locale;

    public ToLowerTester(final Locale locale) {
        this.locale = locale;
    }

    public String findFirstStrangeTwoLetterCombination() {
        char[] b = new char[2];
        for (char c1 = 0; c1 < Character.MAX_VALUE; c1++) {
            b[0] = c1;
            for (char c2 = 0; c2 < Character.MAX_VALUE; c2++) {
                b[1] = c2;
                final String string = new String(b);
                String lower = string.toLowerCase(locale);
                if (string.length() != lower.length()) {
                    return string;
                }
            }
        }
        return null;
    }
    public static void main(final String[] args) {
        Locale[] locales;
        if (args.length != 0) {
            locales = new Locale[args.length];
            for (int i=0; i<args.length; i++) {
                locales[i] = new Locale(args[i]);
            }
        } else {
            locales = Locale.getAvailableLocales();
        }
        for (Locale locale : locales) {
            System.out.println("Testing " + locale + "...");
            String result = new ToLowerTester(locale).findFirstStrangeTwoLetterCombination();
            if (result != null) {
                String lower = result.toLowerCase(locale);
                System.out.println("Found strange two letter combination for locale "
                    + locale + ": <" + result + "> (" + result.length() + ") -> <"
                    + lower + "> (" + lower.length() + ")");
            }
        }
    }
}

سيقوم تشغيل هذا الرمز بأسماء المحطة المذكورة في الإجابة المقبولة بطباعة بعض الأمثلة. سيحاول تشغيله بدون حجة جميع اللغات المتاحة (واستغرق بعض الوقت!).

إنها ليست واسعة النطاق ، لأنه من الناحية النظرية يمكن أن تكون هناك سلاسل متعددة الأشرطة تتصرف بشكل مختلف ، لكنها تقريب جيد.

لاحظ أيضًا أن العديد من المجموعات التي يتم إنتاجها من شروحين تم إنتاجها بهذه الطريقة ربما تكون غير صالحة لـ UTF-16 ، وبالتالي فإن حقيقة أنه لا يمكن إلقاء اللوم على أي شيء في هذا الرمز إلا على واجهة برمجة تطبيقات سلسلة قوية للغاية في Java.

وأخيراً وليس آخراً: حتى لو كان الافتراض صحيحًا للتنفيذ الحالي لـ Java ، يمكن أن يتغير بسهولة بمجرد أن تنفذ الإصدارات المستقبلية من Java الإصدارات المستقبلية من معيار Unicod تمسك بالحقيقه.

لذلك بناء على هذا لا يزال فكرة سيئة للغاية.

تذكر أيضًا أن ToupperCase () لا يحافظ على الطول أيضًا. مثال: "Straße" يصبح "Strasse" للموقع الألماني. لذلك أنت مشدود إلى حد ما إذا كنت تعمل مع سلاسل حساسة للحالة وتحتاج إلى تخزين الفهرس لشيء ما.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top