[Twitter] Twitter에서 글자수 제한

2011. 9. 27. 18:48Others/SNS

Twitter는 Tweet의 글자를 140자로 제한하지만 이는 사용하는 언어, Encoding 등 상황에 따라서 더욱 더 줄어들 수 있습니다. 대부분의 Twitter 연동 Application에서는 이 부분에 관한 처리가 주요한 이슈 중 하나일 것입니다. 여기에서는 어떻게 Twitter server site code가 글자수 제한에 대해 처리하는지에 대한 정보를 다룹니다. Ruby programming language를 예로 들었지만 대부분의 언어에도 동일하게 적용 수 있을 것입니다.

Unicode 처리와 관련해서 경험이 있는 개발자에게 이 이슈에 대해 간단하게 답변 드리자면, Twitter의 길이제한은 NFC normalized version의 codepoint개수를 통해서 측정된다는 것입니다. 만약 이 말이 어렵다면, 아래에서 설명을 이어나갈 것이므로 염려하지 않으셔도 되지만 그렇지 않다면 Twitter’s International team에 지원해보도록 하세요.

Twitter Character Encoding

API를 통해 전송되는 모든 Twitter Attribute Text는 UTF-8로 Encoding되어야 합니다. 만약 다른 Encoding을 사용하신다면 정상 동작을 보장할 수 없습니다.

Character의 정의

Wikipedia에 Character (computing)에 관련한 글이 있습니다만, 굉장히 기술적이고 모호한 정의를 내리고 있습니다. 우리에게는 컴퓨터 문자 처리에 관한 일반적인 정의가 아니라 Twitter에서 140자 제한에 대해 명확하게 설명할 수 있는 Character의 정의가 필요합니다.

대부분의 Tweet은 1 byte의 문자를 사용합니다. 이러한 Tweet들에서 문자의 개수는 byte 크기와 동일합니다. 영문자와 숫자, 일반적인 기호만을 사용한다면 한 글자는 1byte로 표현될 수 있습니다. 하지만 세상의 수많은 사람들은 한국어와 같은 Multi-byte 문자열을 사용합니다. 또한 ‘café’와 같은 문자는 e에 조합분음기호(Combining Diacritical Marks) ` 가 결합된 경우로써 처리하기가 쉽지 않습니다. 왜냐하면 아래와 같이 똑같은 ‘café’일 지라도 어떻게 문자를 처리하느냐에 따라 다른 byte 수를 가지게 되기 때문입니다.

café

0x63 0x61 0x66 0xC3 0xA9 (5byte)

미리 정의된 문자열 (é는 하나의 완전한 문자로써 표현됨)
café 0x63 0x61 0x66 0x65 0xCC 0x81 (6byte) 조합형 문자 (영문 e에 조합분음기호(`)가 결합됨)

Counting Characters

General Concepts

위에서 말씀 드린 "café"와 같은 문자열은 어떻게 세어야 할까요. 이 문자들은 눈으로 보기에는 정확하게 4자입니다. 데이터가 어떻게 표현되느냐의 관점으로 보면은 이 문자열은 5 또는 6의 UTF-8 byte를 가지게 됩니다. Twitter는 특정 언어를 쓰거나, 위와 같은 특정 문자표현방법을 사용하는 것이 사용자에게 제약이 되는 것을 원하지 않습니다. 따라서 Twitter에서는 "café"와 같은 문자는 조합형(Combining)이든 정의된(Composed) 문자이든 그대로 4글자로 처리하게 됩니다.

대부분의 사용자 입력장치는 조금 더 많은 byte를 차지하는 조합형(Combining)문자를 정의된(Composed)문자로 변경하지만 이러한 처리를 100% 진행된다는 가정하에 문자 수를 처리해서는 안될 것입니다. 아래에서는 Ruby/Rails에서 어떻게 이러한 처리를 할 수 있는지 설명을 드릴 것입니다. 하지만 들어가기 앞서 언어 처리에 대해 공통적으로 적용되는 몇 가지 정보에 대해서 조금 더 설명 드리도록 하겠습니다.

Unicode 표준은 수많은 문자 목록에 대해서 설명하고 있습니다. 여기에서 문자는 codepoints로 표현하고 있으며, U+XXXX 표기법을 통해 문자를 표현합니다. 또한 Unicode 표준에서는 이러한 codepoints를 Encoding할 수 있는 여러 방법을 제공하고 있습니다.(예를 들면 UTF-8, UTF-16 외 다수가 있으며  더 많은 정보는 여기를 참조). 더불어 Unicode 표준은 문자 정렬, 정규표현식, 정규화에 대한 중요성과 상세한 정보도 제공하고 있습니다.

Combining Diacritical Marks – A prelude to Normalization

‘café’와 같이 화면에는 똑같이 보이지만 처리에 따라 다른 Byte를 가지는 문자 수를 처리하는 방법에 대한 이슈의 해결책이 보이기 시작합니다. Unicode 표 중에는 조합분음기호(Combining Diacritical Marks)에 관한 정리가 따로 존재합니다.(여기에서 확인) 이 문자들은 독립적인 문자가 아니라 기본 문자와 결합해서 사용되는 문자입니다. 이러한 문자들은 여러 다른 국가들의 언어로써 사용되고 있습니다. 예를 들어 독일어에는 ü(u+¨)가 사용되며, 스페인어에는 ñ(n+˜)가 있습니다. Unicode에서 제공하는 조합분음기호(Combining Diacritical Marks)와 문자의 조합을 통해 이 세상에 존재하는 모든 언어의 문자를 표현할 수 있게 됩니다.

앞서 언급된 é, ü와 같은 문자들은 위와 같은 조합형 외에 완성된 형태의 문자도 존재합니다. Unicode를 이용하여 하나의 문자를 표현하는 방법은 다양하기 때문에, Unicode Standard에서는 이러한 다른 문자 표현들을 어떻게 정규화(Normalization-중복제거) 할 수 있는지 방법을 제공합니다.

Unicode Normalization

Unicode Standard에서는 정규화를 위한 방법으로써 Canonical, Compatibility라는 두 가지 방법을 제공합니다. 정규화에 대한 정보를 담고 있는 Unicode Standard Annex #15를 통해 차이점에 대한 자세한 정보를 확인하실 수 있습니다. 이 문서는 32장으로 이루어져 있으며, 정규화에 대한 상당히 자세한 정보를 담고 있습니다. 이 문서에 대한 정보 중에 몇 가지 간단한 정보만 여기에서 다루고, 실제 Twitter에서 이용할 수 있는 정규화에 대해 초점을 맞추고자 합니다.

Twitter는 Tweet의 문자 수를 Normalization Form C (NFC) 문자열을 통해 계산하게 됩니다. 이러한 정규화 유형은 위의 café에서 언급했던 두 가지 유형에서 모두 사용하실 수 있습니다. Twitter에서는 UTF-8 Byte 대신 codepoint의 개수를 계산합니다. 위에서 언급했듯이 café의 é는 두 가지 표현 방법을 가지고 있습니다. 첫 번째는 ‘0xC3 0xA9’로 표현하게 되면 2Byte를 차지합니다. 하지만 정규화를 통하면 codepoint(U+00E9)가 되고 1개의 글자로 처리됩니다. 두 번째 표현인 ‘0x65 0xCC 0x81’를 사용하면 UTF-8에서는 3Byte이지만 codepoint가 2개가 사용되므로 2글자로 처리됩니다.

Language Specific Information

Ruby Specific Information

Ruby 1.8에서는 multi-byte 문자열 처리를 위한 ActiveSupport::Multibyte class가 제공됩니다. 이 class는 Unicode Normalization을 위한 method를 제공합니다. 불행히도 실제 구현에서는 그리 간단하지 않습니다만 예제(http://gist.github.com/159484)를 참고하여 구현하실 수 있습니다. 이 예제는 실제로 문자열 개수 계산 문제 해결을 위해서 Twitter에서 사용했던 실제 코드입니다. 위의 예제에서 보여지는 실험을 통해 Tweet 문자의 길이를 계산하는 코드를 다음과 같이 사용하게 되었습니다.

class String
  def display_length
    ActiveSupport::Multibyte::Chars.new(self).normalize(:c).length
  end
end
Java Specific Information

Java는 Unicode Consortium이 정규화 예제를 작성하기 위해 사용했던 언어입니다. Applet Demo와 함께 제공되는 원본코드는 다음 주소에서 확인하실 수 있습니다.

http://unicode.org/reports/tr15/Normalizer.html

Perl Specific Information (and a command line tool)

W3C에서 제공하는 정규화를 위해 Perl로 작성된 ‘명령 행 도구’는 다음 주소에서 확인하실 수 있습니다.

http://www.w3.org/International/charlint/

PHP Specifin Information

PHP에서 정규화는 Normalizer class를 통해 구현하실 수 있습니다.

'Others > SNS' 카테고리의 다른 글

[Facebook] Facebook Connect 개요  (0) 2014.03.19
[Twitter] @Anywhere  (0) 2011.09.28
[Twitter] Web Intents Javascript Events  (0) 2011.09.27
[Twitter] Twitter for Websites-Web Intents  (0) 2011.09.26
[Twitter] Twitter for Websites - Follow Button  (0) 2011.09.23