# Styled String (System API) Styled strings are string objects that facilitate the flexible use of text styles. They can be bound to the **Text** component using the [setStyledString](./ts-basic-components-text.md#setstyledstring12) API in **TextController**, and to the **RichEditor** component using the [setStyledString](ts-basic-components-richeditor.md#setstyledstring12) API in **RichEditorStyledStringController**. > **NOTE** > > This component is supported since API version 13. Updates will be marked with a superscript to indicate their earliest API version. > > This topic describes only system APIs provided by the module. For details about its public APIs, see [Styled String](ts-universal-styled-string.md). ## StyledString ### marshalling static marshalling(styledString: StyledString): ArrayBuffer Marshals a styled string. **System API**: This is a system API. **Atomic service API**: This API can be used in atomic services since API version 13. **System capability**: SystemCapability.ArkUI.ArkUI.Full **Parameters** | Name| Type| Mandatory| Description| | ----- | ----- | ---- | ---- | | styledString | [StyledString](ts-universal-styled-string.md) | Yes | Styled string to marshal.| **Return value** | Type |Description | | ------- | --------------------------------- | | ArrayBuffer | Buffer information after marshalling.
**NOTE**
Currently, text and images are supported.| ### marshalling18+ static marshalling(styledString: StyledString, callback: StyledStringMarshallCallback): ArrayBuffer Marshals a styled string by defining a callback to marshal [StyledStringMarshallingValue](#styledstringmarshallingvalue18). **System API**: This is a system API. **Atomic service API**: This API can be used in atomic services since API version 18. **System capability**: SystemCapability.ArkUI.ArkUI.Full **Parameters** | Name| Type| Mandatory| Description| | ----- | ----- | ---- | ---- | | styledString | [StyledString](ts-universal-styled-string.md) | Yes | Styled string to marshal.| | callback | [StyledStringMarshallCallback](#styledstringmarshallcallback18) | Yes| Callback defining how to marshal [StyledStringMarshallingValue](#styledstringmarshallingvalue18).| **Return value** | Type |Description | | ------- | --------------------------------- | | ArrayBuffer | Buffer information after marshalling.
**NOTE**
Currently, text and images are supported.| ### unmarshalling static unmarshalling(buffer: ArrayBuffer): Promise\ Unarshals a buffer to obtain a styled string. **System API**: This is a system API. **Atomic service API**: This API can be used in atomic services since API version 13. **System capability**: SystemCapability.ArkUI.ArkUI.Full **Parameters** | Name| Type| Mandatory| Description| | ----- | ----- | ---- | ---- | | buffer | ArrayBuffer | Yes | Data marshaled from a styled string.| **Return value** | Type | Description | | -------------------------------- | --------------------- | | Promise\<[StyledString](ts-universal-styled-string.md)> |Promise used to return the result.| ### unmarshalling18+ static unmarshalling(buffer: ArrayBuffer, callback: StyledStringUnmarshallCallback): Promise\ Unmarshals a styled string by defining a callback to [StyledStringMarshallingValue](#styledstringmarshallingvalue18). **System API**: This is a system API. **Atomic service API**: This API can be used in atomic services since API version 18. **System capability**: SystemCapability.ArkUI.ArkUI.Full **Parameters** | Name| Type| Mandatory| Description| | ----- | ----- | ---- | ---- | | buffer | ArrayBuffer | Yes | Data marshaled from a styled string.| | callback | [StyledStringUnmarshallCallback](#styledstringunmarshallcallback18) | Yes| Callback defining how to marshal **ArrayBuffer**.| **Return value** | Type | Description | | -------------------------------- | --------------------- | | Promise\<[StyledString](ts-universal-styled-string.md)> |Promise used to return the result.| **Error codes** For details about the error codes, see [Universal Error Codes](../../errorcode-universal.md). | ID| Error Message| | ------- | -------- | | 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2.Incorrect parameters types; 3. Parameter verification failed. | ## StyledStringMarshallingValue18+ type StyledStringMarshallingValue = UserDataSpan Defines a custom marshalling object for styled strings, which you need to define marshalling and unmarshalling methods. **System API**: This is a system API. **Atomic service API**: This API can be used in atomic services since API version 18. **System capability**: SystemCapability.ArkUI.ArkUI.Full | Type | Description | | ------ | ---------- | | [UserDataSpan](ts-universal-styled-string.md#userdataspan) | User data span style.| ## StyledStringMarshallCallback18+ type StyledStringMarshallCallback = (marshallableVal: StyledStringMarshallingValue) => ArrayBuffer Defines a callback for marshalling [StyledStringMarshallingValue](#styledstringmarshallingvalue18). **System API**: This is a system API. **Atomic service API**: This API can be used in atomic services since API version 18. **System capability**: SystemCapability.ArkUI.ArkUI.Full **Parameters** | Name | Type | Mandatory| Description | | ------- | ------ | ---- | --------------------------- | | marshallableVal | [StyledStringMarshallingValue](#styledstringmarshallingvalue18)| Yes| Object to be marshaled.| **Return value** | Type | Description | | -------------------------------- | --------------------- | | ArrayBuffer | Marshaled data of [StyledStringMarshallingValue](#styledstringmarshallingvalue18).| ## StyledStringUnmarshallCallback18+ type StyledStringUnmarshallCallback = (buf: ArrayBuffer) => StyledStringMarshallingValue Defines a callback for unmarshalling an ArrayBuffer to obtain [StyledStringMarshallingValue](#styledstringmarshallingvalue18). **System API**: This is a system API. **Atomic service API**: This API can be used in atomic services since API version 18. **System capability**: SystemCapability.ArkUI.ArkUI.Full **Parameters** | Name | Type | Mandatory| Description | | ------- | ------ | ---- | --------------------------- | | buf | ArrayBuffer | Yes| Marshaled data of [StyledStringMarshallingValue](#styledstringmarshallingvalue18).| **Return value** | Type | Description | | -------------------------------- | --------------------- | | [StyledStringMarshallingValue](#styledstringmarshallingvalue18) | [StyledStringMarshallingValue](#styledstringmarshallingvalue18) obtained after unmarshalling.| ## Example ### Example 1: Marshalling and Unmarshalling Styled Strings This example demonstrates the marshalling and unmarshalling of styled strings using the **marshalling** and **unmarshalling** APIs. ```ts // xxx.ets import { LengthMetrics } from '@kit.ArkUI' @Entry @Component struct Index { @State textTitle: string = "Marshalling and unmarshalling APIs" @State textResult: string = "Hello world" @State serializeStr: string = "Marshalling" @State flag: boolean = false private textAreaController: TextAreaController = new TextAreaController() private buff: Uint8Array = new Uint8Array() fontStyle: TextStyle = new TextStyle({ fontWeight: FontWeight.Lighter, fontFamily: 'HarmonyOS Sans', fontColor: Color.Green, fontSize: LengthMetrics.vp(30), fontStyle: FontStyle.Normal }) // Create a styled string object. styledString: StyledString = new StyledString("Hello world", [{ start: 0, length: 11, styledKey: StyledStringKey.FONT, styledValue: this.fontStyle }]); @Builder controllableBuild() { Column(){ TextArea({ text: this.textResult, controller: this.textAreaController }).width('95%').height('40%').enableKeyboardOnFocus(false) Button(this.serializeStr) .margin(5) .onClick(async ()=>{ this.flag = !this.flag if (!this.flag) { console.info("Debug: Unmarshalling") let styles: StyledString = await StyledString.unmarshalling(this.buff.buffer) this.textTitle = "After calling decodeTlv, the result of unmarshalling is: " if (styles == undefined) { console.error("Debug: Failed to obtain the styled string.") return } this.textResult = styles.getString() console.info("Debug: this.textResult = " + this.textResult) let stylesArr = styles.getStyles(0, this.textResult.length, StyledStringKey.FONT) console.info("Debug: stylesArr.length = " + stylesArr.length) for (let i = 0; i < stylesArr.length; ++i) { console.info("Debug: style.start = " + stylesArr[i].start) console.info("Debug: style.length = " + stylesArr[i].length) console.info("Debug: style.styledKey = " + stylesArr[i].styledKey) let font = stylesArr[i].styledValue as TextStyle console.info("Debug: style.fontColor = " + font.fontColor) console.info("Debug: style.fontSize = " + font.fontSize) console.info("Debug: style.fontFamily = " + font.fontFamily) console.info("Debug: style.fontStyle = " + font.fontStyle) } let subStr = styles.subStyledString(0, 2) console.info("Debug: subStr = " + subStr.getString()) this.serializeStr = "Marshalling" } else { console.info("Debug: Marshalling") let resultBuffer = StyledString.marshalling(this.styledString) this.buff = new Uint8Array(resultBuffer) this.textTitle = "After calling encodeTlv, the result of marshalling is: " this.textResult = this.buff.toString() console.info("Debug: buff = " + this.buff.toString()) this.serializeStr = "Unmarshalling" } }) }.margin(10) } build() { Column() { Blank().margin(30) Text(this.textTitle) this.controllableBuild() } } } ``` ### Example 2: Marshalling and Unmarshalling Styled Strings with UserDataSpan This example demonstrates the marshalling and unmarshalling of styled strings that include custom user data spans using the **marshalling** and **unmarshalling** APIs. ```ts enum MyUserDataType { TYPE1 = 0, TYPE2 } class MyUserData extends UserDataSpan { constructor(){ super() } marshalling() { console.log("MyUserData marshalling...") const text = "MyUserData1"; const buffer = new ArrayBuffer(text.length + 1); const uint8View = new Uint8Array(buffer); // Write the type. uint8View[0] = MyUserDataType.TYPE1; for (let i = 1; i < text.length; i++) { uint8View[i] = text.charCodeAt(i); } return uint8View.buffer; } unmarshalling() { console.log("MyUserData unmarshalling...") return new MyUserData() } } class MyUserData2 extends UserDataSpan { marshalling() { console.log("MyUserData2 marshalling...") const text = "MyUserData2"; const buffer = new ArrayBuffer(text.length + 1); const uint8View = new Uint8Array(buffer); uint8View[0] = MyUserDataType.TYPE2; for (let i = 1; i < text.length; i++) { uint8View[i] = text.charCodeAt(i); } return uint8View.buffer; } unmarshalling() { console.log("MyUserData2 unmarshalling...") return new MyUserData2() } } @Entry @Component struct MarshallExample1 { controller : TextController = new TextController() build() { Column() { Text(undefined, {controller: this.controller}) Button("Marshall&UnMarshall") .onClick(async () => { let myData = new MyUserData(); let myData2 = new MyUserData2(); let myStyledString = new MutableStyledString("12345", [{ start: 0, length: 3, styledKey: StyledStringKey.USER_DATA, styledValue: myData }, { start: 3, length: 1, styledKey: StyledStringKey.USER_DATA, styledValue: myData2 }]) let buffer = StyledString.marshalling(myStyledString, (marshallingValue: StyledStringMarshallingValue)=> { // Perform marshalling based on the type. if (marshallingValue instanceof MyUserData) { console.log("StyledString.marshalling MyUserData") let value = marshallingValue as MyUserData; return value.marshalling() } else if (marshallingValue instanceof MyUserData2) { console.log("StyledString.marshalling MyUserData2") let value = marshallingValue as MyUserData2; return value.marshalling() } console.log("StyledString.marshalling default") return new ArrayBuffer(10) }) let newStyledString = await StyledString.unmarshalling(buffer, (value: ArrayBuffer) => { // 1. Read the type from the buffer. // 2. Based on the type, choose the appropriate API to parse the buffer. const uint8View = new Uint8Array(value); let type = uint8View[0]; console.log("unmarshalling length:" + uint8View.length) if (type == MyUserDataType.TYPE1) { console.log("unmarshalling type1:" + type) let myUserData = new MyUserData() return myUserData.unmarshalling() } else if (type == MyUserDataType.TYPE2) { console.log("unmarshalling type2:" + type) let myUserData = new MyUserData2() return myUserData.unmarshalling() } return new ArrayBuffer(0) }) this.controller.setStyledString(newStyledString) }) .fontSize(20) .margin(10) } .justifyContent(FlexAlign.Center) .width('100%') .height('100%') } } ```