programing

구체적으로 어떤 JS 엔진에서 Lower Case 및 To Upper Case 로케일에 민감합니까?

topblog 2023. 3. 14. 21:22
반응형

구체적으로 어떤 JS 엔진에서 Lower Case 및 To Upper Case 로케일에 민감합니까?

일부 라이브러리(예: AngularJs, 링크는 코드의 특정 행으로 연결됨)의 코드에서는 표준 대소문자 변환 기능이 아닌 사용자 정의 대소문자 변환 기능이 사용되고 있음을 알 수 있습니다.터키어 로케일을 사용하는 브라우저에서는 표준 기능이 예상대로 작동하지 않는다는 가정은 정당화됩니다.

console.log("SCRIPT".toLowerCase()); // "scrıpt"
console.log("script".toUpperCase()); // "SCRİPT"

하지만 정말일까, 아니면 그런 적이 있을까?브라우저가 정말 이렇게 동작하나요?만약 그렇다면, 그들 중 누가 하나요?node.js는요?다른 JS 엔진?

의 여부 」의 toLocaleLowerCase ★★★★★★★★★★★★★★★★★」toLocaleUpperCase은 을 한다.toLowerCase ★★★★★★★★★★★★★★★★★」toUpperCase케일일 구애 ?? ????

에서 이?Angular 팀은 "Angular"를 선택합니다.if ('i' !== 'I'.toLowerCase())...


브라우저(디바이스)가 터키어 또는 아제르바이잔 로케일을 사용하는 경우, 이 스니펫을 실행하고 문제가 실제로 존재하는 것을 발견하면 저에게 편지를 주세요.

if ('i' !== 'I'.toLowerCase()) {
  document.write('Ooops! toLowerCase is locale-sensitive in your browser. ' +
    'Please write your user-agent in the comments to this question: ' +
    navigator.userAgent); 
} else {
  document.write('toLowerCase isn\'t locale-sensitive in your browser. ' +
    'Everything works as expected!');
}
<html lang="tr">

주의: 테스트할 수 없습니다.


ECMAScript 사양에 따라:

String.protype.toLowerCase ( )

[...]

이 작업을 위해 문자열의 16비트 코드 단위는 유니코드 기본 다국어 플레인에서 코드 포인트로 취급됩니다.대리 코드 포인트는 매핑 없이 S에서 L로 직접 전송됩니다.

결과는 Unicode 문자 데이터베이스의 대/소문자 매핑에 따라 도출되어야 합니다(유니코드 데이터뿐만 아니라 명시적으로도 포함).txt 파일뿐만 아니라 SpecialCasings도 마찬가지입니다.txt 파일(Unicode 2.1.8 이후)을 참조하십시오.

[...]

String.protype.toLocaleLowerCase ( )

이 함수는 로케일에 의존하지 않는 결과가 아니라 호스트 환경의 현재 로케일에 대해 올바른 결과를 생성하는 것을 목적으로 한다는 점을 제외하고 LowerCase와 동일하게 작동합니다.그 언어의 규칙이 일반적인 Unicode 대소문자 매핑과 경합하는 소수의 경우(터키어 등)에만 차이가 있습니다.

[...]

Unicode 문자 데이터베이스 특수 케이스에 따라:

[...]

포맷

이 파일의 엔트리는 다음 기계에서 읽을 수 있는 형식입니다.

<code>; <lower>; <title>; <upper>; (<condition_list>;)? # <comment>

무조건 맵핑

[...]

점으로 I에 대한 표준 동등성을 유지합니다.투르크어는 이하에 기재되어 있습니다.

0130; 0069 0307; 0130; 0130; # LATIN CAPITAL LETTER I WITH DOT ABOVE

[...]

언어 구분 매핑이 완전한 대소문자 매핑은 언어 및 컨텍스트(어떤 문자가 앞 또는 뒤에 오는지)에 따라 달라집니다.상세한 것에 대하여는, 이 파일의 헤더와 Unicode Standard 를 참조해 주세요.

리투아니아어

리투아니아어는 점 뒤에 악센트가 붙을 때 점의 소문자 i를 유지합니다.

대문자 또는 제목 대소문자를 사용하여 "i" 뒤에 있는 DOT를 제거합니다.

0307; 0307; ; ; lt After_Soft_Dotted; # COMBINING DOT ABOVE

위에 액센트가 더 있을 때마다 대문자 I와 J를 소문자로 할 때 위에 명시적인 점을 삽입하십시오.(리투아니아어로 사용되는 악센트에 대하여: 중대, 예리함, 위의 칠드, 그리고 오곤크)

0049; 0069 0307; 0049; 0049; lt More_Above; # LATIN CAPITAL LETTER I

004A; 006A 0307; 004A; 004A; lt More_Above; # LATIN CAPITAL LETTER J

012E; 012F 0307; 012E; 012E; lt More_Above; # LATIN CAPITAL LETTER I WITH OGONEK

00CC; 0069 0307 0300; 00CC; 00CC; lt; # LATIN CAPITAL LETTER I WITH GRAVE

00CD; 0069 0307 0301; 00CD; 00CD; lt; # LATIN CAPITAL LETTER I WITH ACUTE

0128; 0069 0307 0303; 0128; 0128; lt; #LATIN CAPITAL LETTER I WITH TILDE

터키어 및 아제리어

I와 i-dotless; I-dot과 I는 터키어와 Azeri어로 된 케이스 쌍입니다.다음 규칙은 이러한 케이스를 처리합니다.

0130; 0069; 0130; 0130; tr; # LATIN CAPITAL LETTER I WITH DOT ABOVE

0130; 0069; 0130; 0130; az; # LATIN CAPITAL LETTER I WITH DOT ABOVE

캐싱이 낮은 경우 I + dot_above 순서로 dot_above를 삭제하면 i가 됩니다.이는 규범적으로 동등한 I-dot_위의 동작과 일치합니다.

0307; ; 0307; 0307; tr After_I; # COMBINING DOT ABOVE

0307; ; 0307; 0307; az After_I; # COMBINING DOT ABOVE

소문자일 경우 I가 점_위의 앞에 있지 않는 한 점 없는 i로 바뀝니다.

0049; 0131; 0049; 0049; tr Not_Before_Dot; # LATIN CAPITAL LETTER I

0049; 0131; 0049; 0049; az Not_Before_Dot; # LATIN CAPITAL LETTER I

상층부에서는 점선 대문자로 바뀝니다.

0069; 0069; 0130; 0130; tr; # LATIN SMALL LETTER I

0069; 0069; 0130; 0130; az; # LATIN SMALL LETTER I

주의: UnicodeData에는 다음 케이스가 이미 포함되어 있습니다.txt 파일.

0131; 0131; 0049; 0049; tr; # LATIN SMALL LETTER DOTLESS I

EOF

또한 Absolute 초보자용 JavaScript (Terry McNavage 지음)에 따르면:

> "I".toLowerCase() // "i"
> "i".toUpperCase() // "I"
> "I".toLocaleLowerCase() // "<dotless-i>"
> "i".toLocaleUpperCase() // "<dotted-I>"

주의:toLocaleLowerCase() ★★★★★★★★★★★★★★★★★」toLocaleUpperCase()OS 설정에 근거해 케이스 변환을 실시합니다.이전 샘플이 작동하려면 해당 설정을 터키어로 변경해야 합니다.아니면 그냥 내 말을 믿든지!

JavaScript String을 모두 소문자변환하는 것에 대한 bobince 코멘트에 따르면? 질문:

Accept-Language ★★★★★★★★★★★★★★★★★」navigator.language2번으로 하다 Accept-Language는 웹 페이지에서 수신할 언어에 대해 사용자가 선택한 기본 설정을 반영합니다(이 설정은 JS에서 액세스 할 수 없습니다). navigator.language는, 인스톨 되고 있는 Web 브라우저의 현지화를 반영하고 있을 뿐입니다.일반적으로 어떤 용도로도 사용할 수 없습니다.이 두 값은 모두 시스템로케일과 관련이 없습니다.시스템로케일은 ToLocaleLowerCase()의 동작을 결정하는 비트입니다.이것은 브라우저 프리프 범위를 벗어나는 OS 레벨 설정입니다.


「」를 설정합니다.lang="tr-TR"로로 합니다.html한 케이스의OS 는 반영되지 않습니다.

' 아이'나 ''는 '도트리스 아이'나 '도트리스 아이'로만 할 수 것 요.toLowerCase()또는toUpperCase().

신뢰할 수 있는/공식 소식통에 따르면, 저는 당신이 옳다고 생각합니다.'i' !== 'I'.toLowerCase()항상 false로 평가됩니다.

하지만 말씀드렸듯이 여기서는 테스트를 할 수 없었습니다.

ECMA-262 5.1 표준을 따르는 모든 JS 구현은 구현해야 합니다.String.prototype.toLocaleLowerCase그리고.String.prototype.toLocaleUpperCase

그리고 기준에 따라toLocaleLowerCase는 로케일 고유의 매핑에 따라 문자열을 소문자 매핑으로 변환하는 것으로 간주됩니다.

반면에.toLowerCase는 Unicode 매핑에서 정의된 소문자 문자열로 변환합니다.

대부분의 언어용toLocaleLowerCase그리고.toLowerCase같은 결과를 낳다그러나 터키어와 같은 특정 언어에서는 케이스 매핑이 유니코드 매핑을 따르지 않습니다.toLowerCase그리고.toLocaleLowerCase다른 결과를 가져오다

사용하는 라이브러리/프레임워크(Jquery, Angular, Node ather)는 전혀 차이가 없습니다.JS 라이브러리를 실행하는 데 사용하는 JS 구현에서 작업을 만들고 변경할 수 있습니다.

모든 실질적인 목적을 위해 노드/각도 또는 기타 JS 라이브러리 및 프레임워크는 문자열을 다룰 때 모두 동일하게 동작한다고 결론짓는 것이 정확합니다(ECMA-262 3 이상을 구현하는 JS 엔진에서 사용되는 경우).그러나 많은 프레임워크가 string 오브젝트를 확장하여 기능을 추가하지만 ECMA-262 5.1에서 정의된 기본 속성 함수는 항상 존재하며 동일하게 동작합니다.

상세한 것에 대하여는, http://www.ecma-international.org/ecma-262/5.1/ #sec-15.5.4.17 을 참조해 주세요.

브라우저에 관한 한, 모든 최신 브라우저는 JS 엔진에 ECMA-262 5.1 표준을 구현합니다.Node에 대해서는 잘 모르겠습니다만, Node에 대한 노출이 한정되어 있기 때문에, JS도 ECMA-262 5.1 규격에 따라 실장되어 있다고 생각합니다.

언급URL : https://stackoverflow.com/questions/28792027/in-what-js-engines-specifically-are-tolowercase-touppercase-locale-sensitive

반응형